/*
 *  ccn_ccn.h
 *  Abstraction
 *
 *  Created by Ilya on 7/29/11.
 *  Copyright 2011 __MyCompanyName__. All rights reserved.
 *
 */

#ifndef CCN_CCN_DEFINED
#define CCN_CCN_DEFINED

#include <stdint.h>
#include "ccn_coding.h"
#include "ccn_charbuf.h"
#include "ccn_indexbuf.h"

enum ccn_marker {
  CCN_MARKER_NONE = -1,
  CCN_MARKER_SEQNUM  = 0x00, /**< consecutive block sequence numbers */
  CCN_MARKER_CONTROL = 0xC1, /**< commands, etc. */ 
  CCN_MARKER_OSEQNUM = 0xF8, /**< deprecated */
  CCN_MARKER_BLKID   = 0xFB, /**< nonconsecutive block ids */
  CCN_MARKER_VERSION = 0xFD  /**< timestamp-based versioning */
};


/*********** Interest parsing ***********/

/*
 * The parse of an interest results in an array of offsets into the 
 * wire representation, with the start and end of each major element and
 * a few of the inportant sub-elements.  The following enum allows those
 * array items to be referred to symbolically.  The *_B_* indices correspond
 * to beginning offsets and the *_E_* indices correspond to ending offsets.
 * An omitted element has its beginning and ending offset equal to each other.
 * Normally these offsets will end up in non-decreasing order.
 * Some aliasing tricks may be played here, e.g. since
 * offset[CCN_PI_E_ComponentLast] is always equal to
 * offset[CCN_PI_E_LastPrefixComponent],
 * we may define CCN_PI_E_ComponentLast = CCN_PI_E_LastPrefixComponent.
 * However, code should not rely on that,
 * since it may change from time to time as the
 * interest schema evolves.
 */
enum ccn_parsed_interest_offsetid {
  CCN_PI_B_Name,
  CCN_PI_B_Component0,
  CCN_PI_B_LastPrefixComponent,
  CCN_PI_E_LastPrefixComponent,
  CCN_PI_E_ComponentLast = CCN_PI_E_LastPrefixComponent,
  CCN_PI_E_Name,
  CCN_PI_B_MinSuffixComponents,
  CCN_PI_E_MinSuffixComponents,
  CCN_PI_B_MaxSuffixComponents,
  CCN_PI_E_MaxSuffixComponents,
  CCN_PI_B_PublisherID, // XXX - rename
  CCN_PI_B_PublisherIDKeyDigest,
  CCN_PI_E_PublisherIDKeyDigest,
  CCN_PI_E_PublisherID,
  CCN_PI_B_Exclude,
  CCN_PI_E_Exclude,
  CCN_PI_B_ChildSelector,
  CCN_PI_E_ChildSelector,
  CCN_PI_B_AnswerOriginKind,
  CCN_PI_E_AnswerOriginKind,
  CCN_PI_B_Scope,
  CCN_PI_E_Scope,
  CCN_PI_B_InterestLifetime,
  CCN_PI_E_InterestLifetime,
  CCN_PI_B_Nonce,
  CCN_PI_E_Nonce,
  CCN_PI_B_OTHER,
  CCN_PI_E_OTHER,
  CCN_PI_E
};


struct ccn_parsed_interest {
  int magic;
  int prefix_comps;
  int min_suffix_comps;
  int max_suffix_comps;
  int orderpref;
  int answerfrom;
  int scope;
  unsigned short offset[CCN_PI_E+1];
};

/*
 * Bitmasks for AnswerOriginKind
 */
#define CCN_AOK_CS      0x1     /* Answer from content store */
#define CCN_AOK_NEW     0x2     /* OK to produce new content */
#define CCN_AOK_DEFAULT (CCN_AOK_CS | CCN_AOK_NEW)
#define CCN_AOK_STALE   0x4     /* OK to answer with stale data */
#define CCN_AOK_EXPIRE  0x10    /* Mark as stale (must have Scope 0) */

/***********************************
 * Low-level binary formatting
 */

/*
 * Append a ccnb start marker
 *
 * This forms the basic building block of ccnb-encoded data.
 * c is the buffer to append to.
 * Return value is 0, or -1 for error.
 */
int ccn_charbuf_append_tt(struct ccn_charbuf *c, size_t val, enum ccn_tt tt);

/**
 * Append a CCN_CLOSE
 *
 * Use this to close off an element in ccnb-encoded data.
 * @param c is the buffer to append to.
 * @returns 0 for success or -1 for error.
 */
int ccn_charbuf_append_closer(struct ccn_charbuf *c);

/***********************************
 * Slightly higher level binary formatting
 */

/*
 * Append a non-negative integer as a UDATA.
 */
int ccnb_append_number(struct ccn_charbuf *c, int nni);

/*
 * Append a binary timestamp
 * as a BLOB using the ccn binary Timestamp representation (12-bit fraction).
 */
int ccnb_append_timestamp_blob(struct ccn_charbuf *c,
                               enum ccn_marker marker,
                               long long secs, int nsecs);

/*
 * Append a binary timestamp, using the current time.
 */
int ccnb_append_now_blob(struct ccn_charbuf *c, enum ccn_marker marker);

/*
 * Append a start-of-element marker.
 */
int ccnb_element_begin(struct ccn_charbuf *c, enum ccn_dtag dtag);

/*
 * Append an end-of-element marker.
 * This is the same as ccn_charbuf_append_closer()
 */
int ccnb_element_end(struct ccn_charbuf *c);

/*
 * Append a tagged BLOB
 */
int ccnb_append_tagged_blob(struct ccn_charbuf *c, enum ccn_dtag dtag,
                            const void *data, size_t size);

/*
 * Append a tagged UDATA string, with printf-style formatting
 */
int ccnb_tagged_putf(struct ccn_charbuf *c, enum ccn_dtag dtag,
                     const char *fmt, ...);



/***********************************
 * Binary decoding
 * These routines require that the whole binary object be buffered.
 */

struct ccn_buf_decoder {
  struct ccn_skeleton_decoder decoder;
  const unsigned char *buf;
  size_t size;
};

struct ccn_buf_decoder *ccn_buf_decoder_start(struct ccn_buf_decoder *d,
                                              const unsigned char *buf, size_t size);

void ccn_buf_advance(struct ccn_buf_decoder *d);
int ccn_buf_advance_past_element(struct ccn_buf_decoder *d);

/* The match routines return a boolean - true for match */
int ccn_buf_match_dtag(struct ccn_buf_decoder *d, enum ccn_dtag dtag);

int ccn_buf_match_some_dtag(struct ccn_buf_decoder *d);

int ccn_buf_match_some_blob(struct ccn_buf_decoder *d);
int ccn_buf_match_blob(struct ccn_buf_decoder *d,
                       const unsigned char **bufp, size_t *sizep);

int ccn_buf_match_udata(struct ccn_buf_decoder *d, const char *s);

int ccn_buf_match_attr(struct ccn_buf_decoder *d, const char *s);

/* On error, the parse routines enter an error state and return a negative value. */
/*int ccn_parse_required_tagged_BLOB(struct ccn_buf_decoder *d,
                                   enum ccn_dtag dtag,
                                   int minlen, int maxlen);
int ccn_parse_optional_tagged_BLOB(struct ccn_buf_decoder *d,
                                   enum ccn_dtag dtag,
                                   int minlen, int maxlen);
int ccn_parse_nonNegativeInteger(struct ccn_buf_decoder *d);
int ccn_parse_optional_tagged_nonNegativeInteger(struct ccn_buf_decoder *d,
                                                 enum ccn_dtag dtag);
int ccn_parse_uintmax(struct ccn_buf_decoder *d, uintmax_t *result);
int ccn_parse_tagged_string(struct ccn_buf_decoder *d,
                            enum ccn_dtag dtag, struct ccn_charbuf *store);*/
/* check the decoder error state for these two - result can't be negative */
/*uintmax_t ccn_parse_required_tagged_binary_number(struct ccn_buf_decoder *d,
                                                  enum ccn_dtag dtag,
                                                  int minlen, int maxlen);
uintmax_t ccn_parse_optional_tagged_binary_number(struct ccn_buf_decoder *d,
                                                  enum ccn_dtag dtag,
                                                  int minlen, int maxlen,
                                                  uintmax_t default_value);*/

/**
 * Enter an error state if element closer not found.
 */
void ccn_buf_check_close(struct ccn_buf_decoder *d);

/*
 * ccn_ref_tagged_BLOB: Get address & size associated with blob-valued element
 * Returns 0 for success, negative value for error.
 */
int ccn_ref_tagged_BLOB(enum ccn_dtag tt,
                        const unsigned char *buf,
                        size_t start, size_t stop,
                        const unsigned char **presult, size_t *psize);

/*
 * ccn_parse_Name: Parses a ccnb-encoded name
 * components may be NULL, otherwise is filled in with Component boundary offsets
 * Returns the number of Components in the Name, or -1 if there is an error.
 */
int ccn_parse_Name(struct ccn_buf_decoder *d, struct ccn_indexbuf *components);

/***********************************
 * Authenticators and signatures for content are constructed in charbufs
 * using the following routines.
 */

enum ccn_content_type {
  CCN_CONTENT_DATA = 0x0C04C0,
  CCN_CONTENT_ENCR = 0x10D091,
  CCN_CONTENT_GONE = 0x18E344,
  CCN_CONTENT_KEY  = 0x28463F,
  CCN_CONTENT_LINK = 0x2C834A,
  CCN_CONTENT_NACK = 0x34008A
};


/*********** ContentObject parsing ***********/
/* Analogous to enum ccn_parsed_interest_offsetid, but for content */
enum ccn_parsed_content_object_offsetid {
  CCN_PCO_B_Signature,
  CCN_PCO_B_DigestAlgorithm,
  CCN_PCO_E_DigestAlgorithm,
  CCN_PCO_B_Witness,
  CCN_PCO_E_Witness,
  CCN_PCO_B_SignatureBits,
  CCN_PCO_E_SignatureBits,
  CCN_PCO_E_Signature,
  CCN_PCO_B_Name,
  CCN_PCO_B_Component0,
  CCN_PCO_E_ComponentN,
  CCN_PCO_E_ComponentLast = CCN_PCO_E_ComponentN,
  CCN_PCO_E_Name,
  CCN_PCO_B_SignedInfo,
  CCN_PCO_B_PublisherPublicKeyDigest,
  CCN_PCO_E_PublisherPublicKeyDigest,
  CCN_PCO_B_Timestamp,
  CCN_PCO_E_Timestamp,
  CCN_PCO_B_Type,
  CCN_PCO_E_Type,
  CCN_PCO_B_FreshnessSeconds,
  CCN_PCO_E_FreshnessSeconds,
  CCN_PCO_B_FinalBlockID,
  CCN_PCO_E_FinalBlockID,
  CCN_PCO_B_KeyLocator,
  /* Exactly one of Key, Certificate, or KeyName will be present */
  CCN_PCO_B_Key_Certificate_KeyName,
  CCN_PCO_B_KeyName_Name,
  CCN_PCO_E_KeyName_Name,
  CCN_PCO_B_KeyName_Pub,
  CCN_PCO_E_KeyName_Pub,
  CCN_PCO_E_Key_Certificate_KeyName,
  CCN_PCO_E_KeyLocator,
  CCN_PCO_E_SignedInfo,
  CCN_PCO_B_Content,
  CCN_PCO_E_Content,
  CCN_PCO_E
};

struct ccn_parsed_ContentObject {
  int magic;
  enum ccn_content_type type;
  int name_ncomps;
  unsigned short offset[CCN_PCO_E+1];
  unsigned char digest[32];	/* Computed only when needed */
  int digest_bytes;
};
#endif
