summaryrefslogtreecommitdiffstats
path: root/python/generic.cc
blob: 16f1cce9925a7f8c582f973dc21d4310d5b54fbc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// -*- mode: cpp; mode: fold -*-
// Description								/*{{{*/
// $Id: generic.cc,v 1.1.1.1 2001/02/20 06:32:01 jgg Exp $
/* ######################################################################

   generic - Some handy functions to make integration a tad simpler

   ##################################################################### */
									/*}}}*/
// Include Files							/*{{{*/
#include "generic.h"
using namespace std;


#include <apt-pkg/error.h>
									/*}}}*/

// HandleErrors - This moves errors from _error to Python Exceptions	/*{{{*/
// ---------------------------------------------------------------------
/* We throw away all warnings and only propogate the first error. */
PyObject *HandleErrors(PyObject *Res)
{
   string Err;
   int errcnt = 0;
   int wrncnt = 0;
   while (_error->empty() == false)
   {
      string Msg;
      bool Type = _error->PopMessage(Msg);
      if (errcnt > 0 || wrncnt > 0)
         Err.append(", ");
      Err.append((Type == true ? "E:" : "W:"));
      Err.append(Msg);
      if (Type)
          ++errcnt;
      else
          ++wrncnt;
   }
   if (errcnt > 0)
   {
       PyErr_SetString(PyAptError,Err.c_str());
       goto err;
   }
   else if (wrncnt > 0)
   {
       if (PyErr_WarnEx(PyAptWarning, Err.c_str(), 1) == -1)
           goto err;
   }

   return Res;
err:
   if (Res != 0)
      Py_DECREF(Res);

    return nullptr;
}

									/*}}}*/
// ListToCharChar - Convert a list to an array of char char		/*{{{*/
// ---------------------------------------------------------------------
/* Caller must free the result. 0 on error. */
const char **ListToCharChar(PyObject *List,bool NullTerm)
{
   // Convert the argument list into a char **
   int Length = PySequence_Length(List);
   const char **Res = new const char *[Length + (NullTerm == true?1:0)];
   for (int I = 0; I != Length; I++)
   {
      PyObject *Itm = PySequence_GetItem(List,I);
      Res[I] = PyObject_AsString(Itm);
      if (Res[I] == nullptr) {
         delete [] Res;
         return nullptr;
      }
   }
   if (NullTerm == true)
      Res[Length] = 0;
   return Res;
}
									/*}}}*/
// CharCharToList - Inverse of the above				/*{{{*/
// ---------------------------------------------------------------------
/* Zero size indicates the list is Null terminated. */
PyObject *CharCharToList(const char **List,unsigned long Size)
{
   if (Size == 0)
   {
      for (const char **I = List; *I != 0; I++)
	 Size++;
   }

   // Convert the whole configuration space into a list
   PyObject *PList = PyList_New(Size);
   for (unsigned long I = 0; I != Size; I++, List++)
      PyList_SetItem(PList,I,CppPyString(*List));

   return PList;
}
									/*}}}*/

int PyApt_Filename::init(PyObject *object)
{
   this->object = NULL;
   this->path = NULL;

#if PY_MAJOR_VERSION < 3 || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 2)
   this->path = PyObject_AsString(object);
   return this->path ? 1 : 0;
#else
   if (PyUnicode_Check(object)) {
      object = PyUnicode_EncodeFSDefault(object);
   } else if (PyBytes_Check(object)) {
      Py_INCREF(object);
   } else {
      return 0;
   }

   this->object = object;
   this->path = PyBytes_AS_STRING(this->object);
   return 1;
#endif
}