1 /*****************************************************************************\
2 pcardext - Python extension for HP photocard services
3
4 (c) Copyright 2003-2015 HP Development Company, L.P.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program 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
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
20 Requires:
21 Python 2.2+
22
23 Author: Don Welch
24
25 \*****************************************************************************/
26
27 #include <Python.h>
28 #include <structmember.h>
29 #include "../fat.h"
30
31
32 /* Ref: PEP 353 (Python 2.5) */
33 #if PY_VERSION_HEX < 0x02050000
34 typedef int Py_ssize_t;
35 #define PY_SSIZE_T_MAX INT_MAX
36 #define PY_SSIZE_T_MIN INT_MIN
37 #endif
38
39 int verbose=0;
40
41 PyObject * readsectorFunc = NULL;
42 PyObject * writesectorFunc = NULL;
43
ReadSector(int sector,int nsector,void * buf,int size)44 int ReadSector(int sector, int nsector, void *buf, int size)
45 {
46 PyObject * result;
47 char * result_str;
48
49 if( readsectorFunc )
50 {
51 if( nsector <= 0 || (nsector*FAT_HARDSECT) > size || nsector > FAT_BLKSIZE )
52 goto abort;
53
54 result = PyObject_CallFunction( readsectorFunc, "ii", sector, nsector );
55
56 if( result )
57 {
58 Py_ssize_t len = 0;
59 PyString_AsStringAndSize( result, &result_str, &len );
60
61 if( len < nsector*FAT_HARDSECT )
62 {
63 goto abort;
64 }
65
66 memcpy( buf, result_str, nsector*FAT_HARDSECT );
67 return 0;
68 }
69 }
70
71 abort:
72 return 1;
73 }
74
WriteSector(int sector,int nsector,void * buf,int size)75 int WriteSector(int sector, int nsector, void *buf, int size )
76 {
77 PyObject * result;
78
79 if( writesectorFunc )
80 {
81 result = PyObject_CallFunction( writesectorFunc, "iis#", sector, nsector, buf, size );
82
83 return PyInt_AS_LONG( result );
84 }
85
86 return 1;
87 }
88
89
pcardext_mount(PyObject * self,PyObject * args)90 PyObject * pcardext_mount( PyObject * self, PyObject * args )
91 {
92 if( !PyArg_ParseTuple( args, "OO", &readsectorFunc, &writesectorFunc ) )
93 {
94 return Py_BuildValue( "i", 1 );
95 }
96
97 if( !PyCallable_Check( readsectorFunc ) || !PyCallable_Check( writesectorFunc ) )
98 {
99 return Py_BuildValue( "i", 2 );
100 }
101
102 Py_INCREF( readsectorFunc );
103 Py_INCREF( writesectorFunc );
104
105 int i = FatInit();
106 /*char buf[1024];
107 sprintf( buf, "print 'FatInit()=%d\n'", i );
108 PyRun_SimpleString( buf );*/
109
110 return Py_BuildValue( "i", i ); // ==0 ->OK, !=0 --> NG
111 }
112
113
pcardext_df(PyObject * self,PyObject * args)114 PyObject * pcardext_df( PyObject * self, PyObject * args )
115 {
116 return Py_BuildValue( "i", FatFreeSpace() );
117 }
118
119
pcardext_ls(PyObject * self,PyObject * args)120 PyObject * pcardext_ls( PyObject * self, PyObject * args )
121 {
122 PyObject * file_list;
123 file_list = PyList_New((Py_ssize_t)0);
124 FILE_ATTRIBUTES fa;
125
126 FatDirBegin( &fa );
127
128 do
129 {
130 if( fa.Attr != 'x' )
131 PyList_Append( file_list, Py_BuildValue( "(sci)", fa.Name, fa.Attr, fa.Size ) );
132
133 } while( FatDirNext( &fa ) );
134
135 return file_list;
136 }
137
138
pcardext_cp(PyObject * self,PyObject * args)139 PyObject * pcardext_cp( PyObject * self, PyObject * args )
140 {
141 char * name;
142 int fileno = 0;
143
144 if( !PyArg_ParseTuple( args, "si", &name, &fileno ) )
145 {
146 return Py_BuildValue( "i", 0 );
147 }
148
149 return Py_BuildValue( "i", FatReadFile( name, fileno ) );
150 }
151
pcardext_cd(PyObject * self,PyObject * args)152 PyObject * pcardext_cd( PyObject * self, PyObject * args )
153 {
154 char * dir;
155
156 if( !PyArg_ParseTuple( args, "s", &dir ) )
157 {
158 return Py_BuildValue( "i", 0 );
159 }
160
161 FatSetCWD( dir );
162
163 return Py_BuildValue( "i", 1 );
164 }
165
pcardext_rm(PyObject * self,PyObject * args)166 PyObject * pcardext_rm( PyObject * self, PyObject * args )
167 {
168 char * name;
169 if( !PyArg_ParseTuple( args, "s", &name ) )
170 {
171 return Py_BuildValue( "i", 0 );
172 }
173
174 return Py_BuildValue( "i", FatDeleteFile( name ) );
175 }
176
pcardext_umount(PyObject * self,PyObject * args)177 PyObject * pcardext_umount( PyObject * self, PyObject * args )
178 {
179 return Py_BuildValue( "" );
180 }
181
pcardext_info(PyObject * self,PyObject * args)182 PyObject * pcardext_info( PyObject * self, PyObject * args )
183 {
184 PHOTO_CARD_ATTRIBUTES pa;
185 FatDiskAttributes( &pa );
186
187 return Py_BuildValue( "(siiiiissi)", pa.OEMID, pa.BytesPerSector, pa.SectorsPerCluster, pa.ReservedSectors,
188 pa.RootEntries, pa.SectorsPerFat, pa.VolumeLabel, pa.SystemID,
189 pa.WriteProtect );
190 }
191
pcardext_read(PyObject * self,PyObject * args)192 PyObject * pcardext_read( PyObject * self, PyObject * args )
193 {
194 char * name;
195 int offset = 0;
196 Py_ssize_t len = 0;
197 void * buffer;
198
199 if( !PyArg_ParseTuple( args, "sii", &name, &offset, &len ) )
200 {
201 return Py_BuildValue( "s", "" );
202 }
203
204 buffer = alloca( len );
205
206 if( FatReadFileExt( name, offset, len, buffer ) == len )
207 {
208 return PyString_FromStringAndSize( (char *)buffer, len );
209 }
210 else
211 {
212 return Py_BuildValue( "s", "" );
213 }
214
215
216 }
217
218
219 static PyMethodDef pcardext_methods[] =
220 {
221 { "mount", (PyCFunction)pcardext_mount, METH_VARARGS },
222 { "ls", (PyCFunction)pcardext_ls, METH_VARARGS },
223 { "cp", (PyCFunction)pcardext_cp, METH_VARARGS },
224 { "cd", (PyCFunction)pcardext_cd, METH_VARARGS },
225 { "rm", (PyCFunction)pcardext_rm, METH_VARARGS },
226 { "umount", (PyCFunction)pcardext_umount, METH_VARARGS },
227 { "df", (PyCFunction)pcardext_df, METH_VARARGS },
228 { "info", (PyCFunction)pcardext_info, METH_VARARGS },
229 { "read", (PyCFunction)pcardext_read, METH_VARARGS },
230 { NULL, NULL }
231 };
232
233
234 static char pcardext_documentation[] = "Python extension for HP photocard services";
235
initpcardext(void)236 void initpcardext( void )
237 {
238 PyObject * mod = Py_InitModule4( "pcardext", pcardext_methods,
239 pcardext_documentation, (PyObject*)NULL,
240 PYTHON_API_VERSION );
241
242 if (mod == NULL)
243 return;
244 }
245
246
247