static PyObject * Exclusion_Name_Obj(unsigned char *buf, size_t start, size_t stop) { struct ccn_charbuf *name; PyObject *py_name, *res; int r; py_name = CCNObject_New_charbuf(NAME, &name); JUMP_IF_NULL(py_name, error); r = ccn_name_init(name); JUMP_IF_NEG_MEM(r, error); r = ccn_name_append_components(name, buf, start, stop); JUMP_IF_NEG_MEM(r, error); res = Name_obj_from_ccn(py_name); Py_DECREF(py_name); return res; error: Py_XDECREF(py_name); return NULL; }
static PyObject * Name_obj_from_ccn_parsed(PyObject *py_content_object) { struct ccn_charbuf *content_object; struct ccn_parsed_ContentObject *parsed_content_object; PyObject *py_ccn_name; PyObject *py_Name; struct ccn_charbuf *name; size_t name_begin, name_end, s; int r; assert(CCNObject_IsValid(CONTENT_OBJECT, py_content_object)); content_object = CCNObject_Get(CONTENT_OBJECT, py_content_object); parsed_content_object = _pyccn_content_object_get_pco(py_content_object); if (!parsed_content_object) return NULL; name_begin = parsed_content_object->offset[CCN_PCO_B_Name]; name_end = parsed_content_object->offset[CCN_PCO_E_Name]; s = name_end - name_begin; debug("ContentObject_from_ccn_parsed Name len=%zd\n", s); if (parsed_content_object->name_ncomps <= 0) { PyErr_SetString(g_PyExc_CCNNameError, "No name stored (or name is" " invalid) in parsed content object"); return NULL; } py_ccn_name = CCNObject_New_charbuf(NAME, &name); if (!py_ccn_name) return NULL; r = ccn_charbuf_append(name, &content_object->buf[name_begin], s); if (r < 0) { Py_DECREF(py_ccn_name); return PyErr_NoMemory(); } #if DEBUG_MSG debug("Name: "); dump_charbuf(name, stderr); debug("\n"); #endif py_Name = Name_obj_from_ccn(py_ccn_name); Py_DECREF(py_ccn_name); return py_Name; }
PyObject * Interest_obj_from_ccn(PyObject *py_interest) { struct ccn_charbuf *interest; struct ccn_parsed_interest *pi; PyObject *py_obj_Interest, *py_o; int r; debug("Interest_from_ccn_parsed start\n"); interest = CCNObject_Get(INTEREST, py_interest); // 1) Create python object py_obj_Interest = PyObject_CallObject(g_type_Interest, NULL); if (!py_obj_Interest) return NULL; pi = _pyccn_interest_get_pi(py_interest); JUMP_IF_NULL(pi, error); // 2) Set ccn_data to a cobject pointing to the c struct // and ensure proper destructor is set up for the c object. r = PyObject_SetAttrString(py_obj_Interest, "ccn_data", py_interest); JUMP_IF_NEG(r, error); // 3) Parse c structure and fill python attributes // using PyObject_SetAttrString ssize_t len; const unsigned char *blob; size_t blob_size, start, end; struct ccn_charbuf * cb; // Best decoding examples are in packet-ccn.c for wireshark plugin? // self.name = None # Start from None to use for templates? len = pi->offset[CCN_PI_E_Name] - pi->offset[CCN_PI_B_Name]; if (len > 0) { PyObject *py_cname; py_cname = CCNObject_New_charbuf(NAME, &cb); JUMP_IF_NULL(py_cname, error); r = ccn_charbuf_append(cb, interest->buf + pi->offset[CCN_PI_B_Name], len); JUMP_IF_NEG_MEM(r, error); py_o = Name_obj_from_ccn(py_cname); Py_DECREF(py_cname); JUMP_IF_NULL(py_o, error); r = PyObject_SetAttrString(py_obj_Interest, "name", py_o); Py_DECREF(py_o); JUMP_IF_NEG(r, error); } else { PyErr_SetString(g_PyExc_CCNInterestError, "Got interest without a" " name!"); goto error; } // self.minSuffixComponents = None # default 0 len = pi->offset[CCN_PI_E_MinSuffixComponents] - pi->offset[CCN_PI_B_MinSuffixComponents]; if (len > 0) { r = ccn_fetch_tagged_nonNegativeInteger(CCN_DTAG_MinSuffixComponents, interest->buf, pi->offset[CCN_PI_B_MinSuffixComponents], pi->offset[CCN_PI_E_MinSuffixComponents]); if (r < 0) { PyErr_SetString(g_PyExc_CCNInterestError, "Invalid" " MinSuffixComponents value"); goto error; } py_o = _pyccn_Int_FromLong(r); JUMP_IF_NULL(py_o, error); r = PyObject_SetAttrString(py_obj_Interest, "minSuffixComponents", py_o); Py_DECREF(py_o); JUMP_IF_NEG(r, error); } // self.maxSuffixComponents = None # default infinity len = pi->offset[CCN_PI_E_MaxSuffixComponents] - pi->offset[CCN_PI_B_MaxSuffixComponents]; if (len > 0) { r = ccn_fetch_tagged_nonNegativeInteger(CCN_DTAG_MaxSuffixComponents, interest->buf, pi->offset[CCN_PI_B_MaxSuffixComponents], pi->offset[CCN_PI_E_MaxSuffixComponents]); if (r < 0) { PyErr_SetString(g_PyExc_CCNInterestError, "Invalid" " MaxSuffixComponents value"); goto error; } py_o = _pyccn_Int_FromLong(r); JUMP_IF_NULL(py_o, error); r = PyObject_SetAttrString(py_obj_Interest, "maxSuffixComponents", py_o); Py_DECREF(py_o); JUMP_IF_NEG(r, error); } // self.publisherPublicKeyDigest = None # SHA256 hash // TODO: what is CN_PI_B_PublisherID? -- looks like it is the data including // the tags while PublisherIDKeyDigest // is just the raw digest -- dk start = pi->offset[CCN_PI_B_PublisherID]; end = pi->offset[CCN_PI_E_PublisherID]; len = end - start; if (len > 0) { r = ccn_ref_tagged_BLOB(CCN_DTAG_PublisherPublicKeyDigest, interest->buf, start, end, &blob, &blob_size); if (r < 0) { PyErr_SetString(g_PyExc_CCNInterestError, "Invalid" " PublisherPublicKeyDigest value"); goto error; } py_o = PyBytes_FromStringAndSize((const char*) blob, blob_size); JUMP_IF_NULL(py_o, error); r = PyObject_SetAttrString(py_obj_Interest, "publisherPublicKeyDigest", py_o); Py_DECREF(py_o); JUMP_IF_NEG(r, error); } // self.exclude = None len = pi->offset[CCN_PI_E_Exclude] - pi->offset[CCN_PI_B_Exclude]; if (len > 0) { PyObject *py_exclusion_filter; py_exclusion_filter = CCNObject_New_charbuf(EXCLUSION_FILTER, &cb); JUMP_IF_NULL(py_exclusion_filter, error); r = ccn_charbuf_append(cb, interest->buf + pi->offset[CCN_PI_B_Exclude], len); JUMP_IF_NEG_MEM(r, error); py_o = ExclusionFilter_obj_from_ccn(py_exclusion_filter); Py_DECREF(py_exclusion_filter); JUMP_IF_NULL(py_o, error); r = PyObject_SetAttrString(py_obj_Interest, "exclude", py_o); Py_DECREF(py_o); JUMP_IF_NEG(r, error); } // self.childSelector = None len = pi->offset[CCN_PI_E_ChildSelector] - pi->offset[CCN_PI_B_ChildSelector]; if (len > 0) { r = ccn_fetch_tagged_nonNegativeInteger(CCN_DTAG_ChildSelector, interest->buf, pi->offset[CCN_PI_B_ChildSelector], pi->offset[CCN_PI_E_ChildSelector]); if (r < 0) { PyErr_SetString(g_PyExc_CCNInterestError, "Invalid" " ChildSelector value"); goto error; } py_o = _pyccn_Int_FromLong(r); JUMP_IF_NULL(py_o, error); r = PyObject_SetAttrString(py_obj_Interest, "childSelector", py_o); Py_DECREF(py_o); JUMP_IF_NEG(r, error); } // self.answerOriginKind = None len = pi->offset[CCN_PI_E_AnswerOriginKind] - pi->offset[CCN_PI_B_AnswerOriginKind]; if (len > 0) { r = ccn_fetch_tagged_nonNegativeInteger(CCN_DTAG_AnswerOriginKind, interest->buf, pi->offset[CCN_PI_B_AnswerOriginKind], pi->offset[CCN_PI_E_AnswerOriginKind]); if (r < 0) { PyErr_SetString(g_PyExc_CCNInterestError, "Invalid" " AnswerOriginKind value"); goto error; } py_o = _pyccn_Int_FromLong(r); JUMP_IF_NULL(py_o, error); r = PyObject_SetAttrString(py_obj_Interest, "answerOriginKind", py_o); Py_DECREF(py_o); JUMP_IF_NEG(r, error); } // self.scope = None len = pi->offset[CCN_PI_E_Scope] - pi->offset[CCN_PI_B_Scope]; if (len > 0) { r = ccn_fetch_tagged_nonNegativeInteger(CCN_DTAG_Scope, interest->buf, pi->offset[CCN_PI_B_Scope], pi->offset[CCN_PI_E_Scope]); if (r < 0) { PyErr_SetString(g_PyExc_CCNInterestError, "Invalid" " Scope value"); goto error; } py_o = _pyccn_Int_FromLong(r); JUMP_IF_NULL(py_o, error); r = PyObject_SetAttrString(py_obj_Interest, "scope", py_o); Py_DECREF(py_o); JUMP_IF_NEG(r, error); } // self.interestLifetime = None len = pi->offset[CCN_PI_E_InterestLifetime] - pi->offset[CCN_PI_B_InterestLifetime]; if (len > 0) { double lifetime; // From packet-ccn.c r = ccn_ref_tagged_BLOB(CCN_DTAG_InterestLifetime, interest->buf, pi->offset[CCN_PI_B_InterestLifetime], pi->offset[CCN_PI_E_InterestLifetime], &blob, &blob_size); if (r < 0) { PyErr_SetString(g_PyExc_CCNInterestError, "Invalid" " InterestLifetime value"); goto error; } /* XXX: probably won't work with bigendian */ lifetime = 0.0; for (size_t i = 0; i < blob_size; i++) lifetime = lifetime * 256.0 + (double) blob[i]; lifetime /= 4096.0; py_o = PyFloat_FromDouble(lifetime); JUMP_IF_NULL(py_o, error); r = PyObject_SetAttrString(py_obj_Interest, "interestLifetime", py_o); Py_DECREF(py_o); JUMP_IF_NEG(r, error); } // self.nonce = None len = pi->offset[CCN_PI_E_Nonce] - pi->offset[CCN_PI_B_Nonce]; if (len > 0) { r = ccn_ref_tagged_BLOB(CCN_DTAG_Nonce, interest->buf, pi->offset[CCN_PI_B_Nonce], pi->offset[CCN_PI_E_Nonce], &blob, &blob_size); if (r < 0) { PyErr_SetString(g_PyExc_CCNInterestError, "Invalid" " Nonce value"); goto error; } py_o = PyBytes_FromStringAndSize((const char *) blob, blob_size); JUMP_IF_NULL(py_o, error); r = PyObject_SetAttrString(py_obj_Interest, "nonce", py_o); Py_DECREF(py_o); JUMP_IF_NEG(r, error); } r = PyObject_SetAttrString(py_obj_Interest, "ccn_data_dirty", Py_False); JUMP_IF_NEG(r, error); // 4) Return the created object debug("Interest_from_ccn ends\n"); return py_obj_Interest; error: Py_DECREF(py_obj_Interest); return NULL; }