@@ -61,13 +61,13 @@ namespace pc
61
61
commitment str_to_commitment ( str );
62
62
63
63
class rpc_request ;
64
-
65
64
// solana rpc REST API client
66
65
class rpc_client : public error
67
66
{
68
67
public:
69
68
70
69
rpc_client ();
70
+ ~rpc_client ();
71
71
72
72
// rpc http connection
73
73
void set_http_conn ( net_connect * );
@@ -90,8 +90,7 @@ namespace pc
90
90
void remove_notify ( rpc_request * );
91
91
92
92
// decode into buffer and return pointer
93
- template <class T >
94
- size_t get_data ( const char *dptr, size_t dlen, T *&ptr );
93
+ size_t get_data ( const char *dptr, size_t dlen, size_t tlen, char *&ptr);
95
94
96
95
// reset state
97
96
void reset ();
@@ -133,7 +132,9 @@ namespace pc
133
132
id_vec_t reuse_; // reuse id list
134
133
sub_map_t smap_; // subscription map
135
134
acc_buf_t abuf_; // account decode buffer
135
+ acc_buf_t zbuf_; // account decompress buffer
136
136
uint64_t id_; // next request id
137
+ void *cxt_;
137
138
};
138
139
139
140
// rpc response or subscrption callback
@@ -240,16 +241,6 @@ namespace pc
240
241
// ///////////////////////////////////////////////////////////////////////
241
242
// wrappers for various solana rpc requests
242
243
243
- template <class T >
244
- size_t rpc_client::get_data ( const char *dptr, size_t dlen, T *&ptr )
245
- {
246
- size_t tlen = enc_base64_len ( sizeof ( T ) );
247
- abuf_.resize ( std::max ( dlen, tlen ) );
248
- dec_base64 ( (const uint8_t *)dptr, dlen, (uint8_t *)&abuf_[0 ] );
249
- ptr = (T*)&abuf_[0 ];
250
- return abuf_.size ();
251
- }
252
-
253
244
namespace rpc
254
245
{
255
246
// get account balance, program data and account meta-data
@@ -266,7 +257,7 @@ namespace pc
266
257
uint64_t get_rent_epoch () const ;
267
258
bool get_is_executable () const ;
268
259
void get_owner ( const char *&, size_t & ) const ;
269
- template <class T > size_t get_data ( T *& ) const ;
260
+ template <class T > size_t get_data ( T *&, size_t len= sizeof (T) ) const ;
270
261
271
262
get_account_info ();
272
263
void request ( json_wtr& ) override ;
@@ -285,9 +276,13 @@ namespace pc
285
276
commitment cmt_;
286
277
};
287
278
288
- template <class T > size_t get_account_info::get_data ( T *&res ) const
279
+ template <class T >
280
+ size_t get_account_info::get_data ( T *&res, size_t tlen ) const
289
281
{
290
- return get_rpc_client ()->get_data ( dptr_, dlen_, res );
282
+ char *ptr;
283
+ size_t len = get_rpc_client ()->get_data ( dptr_, dlen_, tlen, ptr );
284
+ res = (T*)ptr;
285
+ return len;
291
286
}
292
287
293
288
// recent block hash and fee schedule
@@ -421,7 +416,7 @@ namespace pc
421
416
// results
422
417
uint64_t get_slot () const ;
423
418
uint64_t get_lamports () const ;
424
- template <class T > size_t get_data ( T *& ) const ;
419
+ template <class T > size_t get_data ( T *&, size_t len= sizeof (T) ) const ;
425
420
426
421
account_subscribe ();
427
422
void request ( json_wtr& ) override ;
@@ -437,9 +432,13 @@ namespace pc
437
432
commitment cmt_;
438
433
};
439
434
440
- template <class T > size_t account_subscribe::get_data ( T *&res ) const
435
+ template <class T >
436
+ size_t account_subscribe::get_data ( T *&res, size_t tlen ) const
441
437
{
442
- return get_rpc_client ()->get_data ( dptr_, dlen_, res );
438
+ char *ptr;
439
+ size_t len = get_rpc_client ()->get_data ( dptr_, dlen_, tlen, ptr );
440
+ res = (T*)ptr;
441
+ return len;
443
442
}
444
443
445
444
// transaction to transfer funds between accounts
0 commit comments