1 #if defined(HAVE_CONFIG_H) && !defined(GEANYPY_WINDOWS)
2 # include "config.h"
3 #endif
4 
5 #include "geanypy.h"
6 
7 
8 static void
Project_dealloc(Project * self)9 Project_dealloc(Project *self)
10 {
11 	g_return_if_fail(self != NULL);
12 	self->ob_type->tp_free((PyObject *) self);
13 }
14 
15 
16 static int
Project_init(Project * self,PyObject * args,PyObject * kwds)17 Project_init(Project *self, PyObject *args, PyObject *kwds)
18 {
19 	g_return_val_if_fail(self != NULL, -1);
20 	self->project = geany_data->app->project;
21 	return 0;
22 }
23 
24 
25 static PyObject *
Project_get_property(Project * self,const gchar * prop_name)26 Project_get_property(Project *self, const gchar *prop_name)
27 {
28 	g_return_val_if_fail(self != NULL, NULL);
29 	g_return_val_if_fail(prop_name != NULL, NULL);
30 
31 	if (!self->project)
32 		Py_RETURN_NONE;
33 
34 	if (g_str_equal(prop_name, "base_path") && self->project->base_path)
35 		return PyString_FromString(self->project->base_path);
36 	else if (g_str_equal(prop_name, "description") && self->project->description)
37 		return PyString_FromString(self->project->description);
38 	else if (g_str_equal(prop_name, "file_name") && self->project->file_name)
39 		return PyString_FromString(self->project->file_name);
40 	else if (g_str_equal(prop_name, "file_patterns") && self->project->file_patterns)
41 	{
42 		guint i, len;
43 		PyObject *set;
44 		len = g_strv_length(self->project->file_patterns);
45 		set = PyFrozenSet_New(NULL);
46 		for (i = 0; i < len; i++)
47 			PySet_Add(set, PyString_FromString(self->project->file_patterns[i]));
48 		return set;
49 	}
50 	else if (g_str_equal(prop_name, "name") && self->project->name)
51 		return PyString_FromString(self->project->name);
52 	else if (g_str_equal(prop_name, "type") && self->project->type)
53 		return Py_BuildValue("i", self->project->type);
54 
55 	Py_RETURN_NONE;
56 }
57 GEANYPY_PROPS_READONLY(Project);
58 
59 
60 static PyGetSetDef Project_getseters[] = {
61 	GEANYPY_GETSETDEF(Project, "base_path",
62 		"Base path of the project directory (maybe relative)."),
63 	GEANYPY_GETSETDEF(Project, "description",
64 		"Short description of the project."),
65 	GEANYPY_GETSETDEF(Project, "file_name",
66 		"Where the project file is stored."),
67 	GEANYPY_GETSETDEF(Project, "file_patterns",
68 		"Sequence of filename extension patterns."),
69 	GEANYPY_GETSETDEF(Project, "name",
70 		"The name of the project."),
71 	GEANYPY_GETSETDEF(Project, "type",
72 		"Identifier whether it is a pure Geany project or modified/"
73 		"extended by a plugin."),
74 	{ NULL }
75 };
76 
77 
78 PyTypeObject ProjectType = {
79 	PyObject_HEAD_INIT(NULL)
80 	0,											/* ob_size */
81 	"geany.project.Project",					/* tp_name */
82 	sizeof(Project),							/* tp_basicsize */
83 	0,											/* tp_itemsize */
84 	(destructor) Project_dealloc,				/* tp_dealloc */
85 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* tp_print - tp_as_buffer */
86 	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,	/* tp_flags */
87 	"Wrapper around a GeanyProject structure.",	/* tp_doc */
88 	0, 0, 0, 0, 0, 0, 0, 0,						/* tp_traverse - tp_members */
89 	Project_getseters,							/* tp_getset */
90 	0, 0, 0, 0, 0,								/* tp_base - tp_dictoffset */
91 	(initproc) Project_init,					/* tp_init */
92 	0, 0,										/* tp_alloc - tp_new */
93 };
94 
95 
96 static PyMethodDef ProjectModule_methods[] = { { NULL } };
97 
98 
initproject(void)99 PyMODINIT_FUNC initproject(void)
100 {
101 	PyObject *m;
102 
103 	ProjectType.tp_new = PyType_GenericNew;
104 	if (PyType_Ready(&ProjectType) < 0)
105 		return;
106 
107 	m = Py_InitModule3("project", ProjectModule_methods, "Project information");
108 
109 	Py_INCREF(&ProjectType);
110 	PyModule_AddObject(m, "Project", (PyObject *)&ProjectType);
111 }
112