2017-07-24 19:56:30 +00:00
|
|
|
#pragma once
|
2017-07-20 20:03:49 +00:00
|
|
|
/**
|
|
|
|
* This is the definition of an "Exchange"
|
|
|
|
*
|
|
|
|
* Anything that implements the Exchange interface can be used as
|
|
|
|
* an IPFS block exchange protocol.
|
|
|
|
*/
|
|
|
|
#include "ipfs/blocks/block.h"
|
|
|
|
#include "ipfs/cid/cid.h"
|
|
|
|
#include "libp2p/utils/vector.h"
|
|
|
|
|
2017-07-24 19:56:30 +00:00
|
|
|
/**
|
|
|
|
* These are methods that the local IPFS daemon (or client)
|
|
|
|
* call to communicate with the local repository or network
|
|
|
|
*/
|
|
|
|
|
2017-07-20 20:03:49 +00:00
|
|
|
struct Exchange {
|
|
|
|
/**
|
|
|
|
* Retrieve a block from peers within the deadline enforced
|
|
|
|
* by the context
|
2017-07-24 19:56:30 +00:00
|
|
|
*
|
|
|
|
* NOTE: Shouldn't the block parameter be a callback (function pointer)?
|
|
|
|
* Otherwise, this function is going to block. Is that what we want?
|
|
|
|
*
|
2017-07-20 20:03:49 +00:00
|
|
|
* @param context the context
|
|
|
|
* @param cid the hash of the block to retrieve
|
|
|
|
* @param block a pointer to the block (allocated by this method if return is true)
|
|
|
|
* @returns true(1) on success, false(0) otherwise
|
|
|
|
*/
|
2017-07-26 14:48:04 +00:00
|
|
|
int (*GetBlock)(struct Exchange* exchange, struct Cid* cid, struct Block** block);
|
2017-07-20 20:03:49 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Retrieve several blocks
|
|
|
|
* @param context the context
|
|
|
|
* @param Cids a vector of hashes for the blocks to be retrieved
|
|
|
|
* @param blocks a pointer to a vector of retrieved blocks (will be NULL on error)
|
|
|
|
* @returns true(1) on success, otherwise false(0)
|
|
|
|
*/
|
2017-07-26 14:48:04 +00:00
|
|
|
int (*GetBlocks)(struct Exchange* exchange, struct Libp2pVector* Cids, struct Libp2pVector** blocks);
|
2017-07-20 20:03:49 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Announces the existance of a block to this bitswap service. The service will
|
|
|
|
* potentially notify its peers.
|
|
|
|
* NOTE: This is mainly designed to announce blocks added by non-bitswap methods (i.e. the local user)
|
|
|
|
* @param block the block being announced
|
|
|
|
* @returns true(1) on success, false(0) if not
|
|
|
|
*/
|
2017-07-26 14:48:04 +00:00
|
|
|
int (*HasBlock)(struct Exchange* exchange, struct Block* block);
|
2017-07-20 20:03:49 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Determine if we're online
|
|
|
|
* @returns true(1) if we're online
|
|
|
|
*/
|
2017-07-26 14:48:04 +00:00
|
|
|
int (*IsOnline)(struct Exchange*);
|
2017-07-20 20:03:49 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Close up the exchange, and go offline
|
|
|
|
* @returns true(1);
|
|
|
|
*/
|
2017-07-26 14:48:04 +00:00
|
|
|
int (*Close)(struct Exchange*);
|
2017-07-20 20:03:49 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Used by each implementation to maintain state
|
|
|
|
* (will be cast-ed to an implementation-specific structure)
|
|
|
|
*/
|
|
|
|
void* exchangeContext;
|
|
|
|
};
|