2 libloc - A library to determine the location of someone on the Internet
4 Copyright (C) 2017 IPFire Development Team <info@ipfire.org>
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
21 #include <loc/libloc.h>
22 #include <loc/network.h>
24 #include "locationmodule.h"
27 PyObject
* new_network(PyTypeObject
* type
, struct loc_network
* network
) {
28 NetworkObject
* self
= (NetworkObject
*)type
->tp_alloc(type
, 0);
30 self
->network
= loc_network_ref(network
);
33 return (PyObject
*)self
;
36 static PyObject
* Network_new(PyTypeObject
* type
, PyObject
* args
, PyObject
* kwds
) {
37 NetworkObject
* self
= (NetworkObject
*)type
->tp_alloc(type
, 0);
39 return (PyObject
*)self
;
42 static void Network_dealloc(NetworkObject
* self
) {
44 loc_network_unref(self
->network
);
46 Py_TYPE(self
)->tp_free((PyObject
* )self
);
49 static int Network_init(NetworkObject
* self
, PyObject
* args
, PyObject
* kwargs
) {
50 const char* network
= NULL
;
52 if (!PyArg_ParseTuple(args
, "s", &network
))
56 int r
= loc_network_new_from_string(loc_ctx
, &self
->network
, network
);
58 PyErr_Format(PyExc_ValueError
, "Invalid network: %s", network
);
65 static PyObject
* Network_repr(NetworkObject
* self
) {
66 char* network
= loc_network_str(self
->network
);
68 PyObject
* obj
= PyUnicode_FromFormat("<location.Network %s>", network
);
74 static PyObject
* Network_str(NetworkObject
* self
) {
75 char* network
= loc_network_str(self
->network
);
77 PyObject
* obj
= PyUnicode_FromString(network
);
83 static PyObject
* Network_get_country_code(NetworkObject
* self
) {
84 const char* country_code
= loc_network_get_country_code(self
->network
);
86 return PyUnicode_FromString(country_code
);
89 static int Network_set_country_code(NetworkObject
* self
, PyObject
* value
) {
90 const char* country_code
= PyUnicode_AsUTF8(value
);
92 int r
= loc_network_set_country_code(self
->network
, country_code
);
95 PyErr_Format(PyExc_ValueError
,
96 "Invalid country code: %s", country_code
);
104 static PyObject
* Network_get_asn(NetworkObject
* self
) {
105 uint32_t asn
= loc_network_get_asn(self
->network
);
108 return PyLong_FromLong(asn
);
113 static int Network_set_asn(NetworkObject
* self
, PyObject
* value
) {
114 long int asn
= PyLong_AsLong(value
);
116 // Check if the ASN is within the valid range
117 if (asn
<= 0 || asn
> UINT32_MAX
) {
118 PyErr_Format(PyExc_ValueError
, "Invalid ASN %ld", asn
);
122 int r
= loc_network_set_asn(self
->network
, asn
);
129 static struct PyGetSetDef Network_getsetters
[] = {
132 (getter
)Network_get_asn
,
133 (setter
)Network_set_asn
,
139 (getter
)Network_get_country_code
,
140 (setter
)Network_set_country_code
,
147 PyTypeObject NetworkType
= {
148 PyVarObject_HEAD_INIT(NULL
, 0)
149 tp_name
: "location.Network",
150 tp_basicsize
: sizeof(NetworkObject
),
151 tp_flags
: Py_TPFLAGS_DEFAULT
|Py_TPFLAGS_BASETYPE
,
153 tp_dealloc
: (destructor
)Network_dealloc
,
154 tp_init
: (initproc
)Network_init
,
155 tp_doc
: "Network object",
156 tp_getset
: Network_getsetters
,
157 tp_repr
: (reprfunc
)Network_repr
,
158 tp_str
: (reprfunc
)Network_str
,