From: Roger U. <ru...@us...> - 2007-02-08 07:19:59
|
Update of /cvsroot/pywin32/pywin32/win32/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2156 Modified Files: win32file.i Log Message: Add FindStreams Index: win32file.i =================================================================== RCS file: /cvsroot/pywin32/pywin32/win32/src/win32file.i,v retrieving revision 1.71 retrieving revision 1.72 diff -C2 -d -r1.71 -r1.72 *** win32file.i 7 Feb 2007 03:35:35 -0000 1.71 --- win32file.i 8 Feb 2007 07:19:57 -0000 1.72 *************** *** 2721,2725 **** static FindFirstFileTransactedfunc pfnFindFirstFileTransacted=NULL; - // These aren't used yet typedef HANDLE (WINAPI *FindFirstStreamfunc)(LPWSTR, STREAM_INFO_LEVELS, LPVOID, DWORD); static FindFirstStreamfunc pfnFindFirstStream=NULL; --- 2721,2724 ---- *************** *** 2728,2731 **** --- 2727,2732 ---- typedef HANDLE (WINAPI *FindFirstStreamTransactedfunc)(LPWSTR, STREAM_INFO_LEVELS, LPVOID, DWORD, HANDLE); static FindFirstStreamTransactedfunc pfnFindFirstStreamTransacted=NULL; + + // These aren't used yet typedef DWORD (WINAPI *GetFullPathNameTransactedfunc)(LPCTSTR,DWORD,LPTSTR,LPTSTR*,HANDLE); static GetFullPathNameTransactedfunc pfnGetFullPathNameTransacted = NULL; *************** *** 4613,4616 **** --- 4614,4680 ---- } PyCFunction pfnpy_FindFilesIterator=(PyCFunction)py_FindFilesIterator; + + // @pyswig [(long, <o PyUnicode>),...]|FindStreams|List the data streams for a file + // @rdesc Returns a list of tuples containing each stream's size and name + // @comm This uses the API functions FindFirstStreamW, FindNextStreamW and FindClose + // @comm Available on Windows Server 2003 and Vista + // @comm If the Transaction arg is not None, FindFirstStreamTransacted will be called in place of FindFirstStreamW + static PyObject *py_FindStreams(PyObject *self, PyObject *args, PyObject *kwargs) + { + CHECK_PFN(FindFirstStream); + CHECK_PFN(FindNextStream); + + PyObject *obfname, *obtrans=Py_None, *ret=NULL, *ret_item; + WCHAR *fname=NULL; + HANDLE hfind, htrans; + STREAM_INFO_LEVELS lvl = FindStreamInfoStandard; // only level that currently exists + WIN32_FIND_STREAM_DATA fsd; + DWORD err=0, flags=0, ret_cnt=0; // flags are reserved, don't even accept as input + static char *keywords[]={"FileName","Transaction", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O:FindStreams", keywords, + &obfname, // @pyparm <o PyUnicode>|FileName||Name of file (or directory) to operate on + &obtrans)) // @pyparm <o PyHANDLE>|Transaction|None|Handle to a transaction, can be None + return NULL; + if (!PyWinObject_AsHANDLE(obtrans, &htrans, TRUE)) + return NULL; + if (htrans!=NULL) + CHECK_PFN(FindFirstStreamTransacted); + if (!PyWinObject_AsWCHAR(obfname, &fname, FALSE)) + return NULL; + + if (htrans!=NULL) + hfind=(*pfnFindFirstStreamTransacted)(fname, lvl, &fsd, flags, htrans); + else + hfind=(*pfnFindFirstStream)(fname, lvl, &fsd, flags); + PyWinObject_FreeWCHAR(fname); + if (hfind==INVALID_HANDLE_VALUE) + return PyWin_SetAPIError("FindFirstStreamW"); + ret=PyList_New(0); + if (ret!=NULL){ + while (1){ + ret_item=Py_BuildValue("Lu", fsd.StreamSize, fsd.cStreamName); + if ((ret_item==NULL) || (PyList_Append(ret, ret_item)==-1)){ + Py_XDECREF(ret_item); + Py_DECREF(ret); + ret=NULL; + break; + } + Py_DECREF(ret_item); + if (!(*pfnFindNextStream)(hfind, &fsd)){ + err=GetLastError(); + if (err!=ERROR_HANDLE_EOF){ + Py_DECREF(ret); + ret=NULL; + PyWin_SetAPIError("FindNextStream",err); + } + break; + } + } + } + FindClose(hfind); + return ret; + } + PyCFunction pfnpy_FindStreams=(PyCFunction)py_FindStreams; %} *************** *** 4654,4657 **** --- 4718,4723 ---- %native (FindFilesW) pfnpy_FindFilesW; %native (FindFilesIterator) pfnpy_FindFilesIterator; + %native (FindStreams) pfnpy_FindStreams; + %init %{ *************** *** 4676,4681 **** ||(strcmp(pmd->ml_name, "FindFilesW")==0) ||(strcmp(pmd->ml_name, "FindFilesIterator")==0) ! ||(strcmp(pmd->ml_name, "FindFirstStream")==0) // not impl yet ! ||(strcmp(pmd->ml_name, "FindFirstStreamTransacted")==0) // not impl yet ||(strcmp(pmd->ml_name, "GetFullPathNameTransacted")==0) // not impl yet ||(strcmp(pmd->ml_name, "GetLongPathNameTransacted")==0) // not impl yet --- 4742,4746 ---- ||(strcmp(pmd->ml_name, "FindFilesW")==0) ||(strcmp(pmd->ml_name, "FindFilesIterator")==0) ! ||(strcmp(pmd->ml_name, "FindStreams")==0) ||(strcmp(pmd->ml_name, "GetFullPathNameTransacted")==0) // not impl yet ||(strcmp(pmd->ml_name, "GetLongPathNameTransacted")==0) // not impl yet *************** *** 4758,4766 **** pfnCreateDirectoryTransacted=(CreateDirectoryTransactedfunc)GetProcAddress(hmodule, "CreateDirectoryTransactedW"); pfnRemoveDirectoryTransacted=(RemoveDirectoryTransactedfunc)GetProcAddress(hmodule, "RemoveDirectoryTransactedW"); - // these aren't wrapped yet pfnFindFirstStream=(FindFirstStreamfunc)GetProcAddress(hmodule, "FindFirstStreamW"); pfnFindNextStream=(FindNextStreamfunc)GetProcAddress(hmodule, "FindNextStreamW"); pfnFindFirstStreamTransacted=(FindFirstStreamTransactedfunc)GetProcAddress(hmodule, "FindFirstStreamTransactedW"); pfnFindFirstFileTransacted=(FindFirstFileTransactedfunc)GetProcAddress(hmodule, "FindFirstFileTransactedW"); pfnGetFullPathNameTransacted=(GetFullPathNameTransactedfunc)GetProcAddress(hmodule, "GetFullPathNameTransactedW"); pfnGetLongPathNameTransacted=(GetLongPathNameTransactedfunc)GetProcAddress(hmodule, "GetLongPathNameTransactedW"); --- 4823,4831 ---- pfnCreateDirectoryTransacted=(CreateDirectoryTransactedfunc)GetProcAddress(hmodule, "CreateDirectoryTransactedW"); pfnRemoveDirectoryTransacted=(RemoveDirectoryTransactedfunc)GetProcAddress(hmodule, "RemoveDirectoryTransactedW"); pfnFindFirstStream=(FindFirstStreamfunc)GetProcAddress(hmodule, "FindFirstStreamW"); pfnFindNextStream=(FindNextStreamfunc)GetProcAddress(hmodule, "FindNextStreamW"); pfnFindFirstStreamTransacted=(FindFirstStreamTransactedfunc)GetProcAddress(hmodule, "FindFirstStreamTransactedW"); pfnFindFirstFileTransacted=(FindFirstFileTransactedfunc)GetProcAddress(hmodule, "FindFirstFileTransactedW"); + // these aren't wrapped yet pfnGetFullPathNameTransacted=(GetFullPathNameTransactedfunc)GetProcAddress(hmodule, "GetFullPathNameTransactedW"); pfnGetLongPathNameTransacted=(GetLongPathNameTransactedfunc)GetProcAddress(hmodule, "GetLongPathNameTransactedW"); |