genericopenlibs/openenvcore/libc/src/wfindfirst.cpp
changeset 31 ce057bb09d0b
child 45 4b03adbd26ca
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/openenvcore/libc/src/wfindfirst.cpp	Fri Jun 04 16:20:51 2010 +0100
@@ -0,0 +1,215 @@
+// Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Name        : wfindfirst.cpp
+// Part of     : libc library
+// The _wfindfirst function provides information about the first 
+// instance of a file name that matches the file specified in the 
+// filespec argument. Any wildcard combination supported by the host 
+// operating system can be used in filespec. 
+// File information is returned in a _wfinddata_t structure, defined in wchar.h
+// FUNCTIONS
+// _wfindfirst, _wfindnext, _findclose
+// INDEX
+// _wfindfirst
+// _wfindnext
+// _findclose
+// ANSI_SYNOPSIS
+// #include <wchar.h>
+// int _wfindnext(intptr_t, struct _wfinddata_t *); 
+// intptr_t wfindfirst(const wchar_t* , struct _wfinddata_t* );
+// int findclose( intptr_t handle);
+// The _wfindfirst function provides information about the first 
+// instance of a file name that matches the file specified in the 
+// filespec argument. Any wildcard combination supported by the host 
+// operating system can be used in filespec. 
+// File information is returned in a _wfinddata_t structure, defined in wchar.h
+// wfindnext find the next name, if any, that matches the filespec argument 
+// in a previous call to _findfirst, and then alter the fileinfo structure 
+// contents accordingly.
+// _findclose  
+// Closes the specified search handle and releases associated resources.
+// RETURNS
+// _findclose
+// If successful, returns 0. Otherwise, it returns –1 and sets errno to ENOENT
+// _wfindnext
+// If successful, returns 0. Otherwise, returns –1 and sets errno to a value indicating the nature of the failure. Possible error codes are shown below. 
+// EINVAL
+// Invalid parameter: fileinfo was NULL. Or, the operating system returned an unexpected error.
+// ENOENT
+// No more matching files could be found.
+// _wfindfirst
+// If successful, _findfirst returns a unique search handle identifying the file or group of files
+// matching the filespec specification, which can be used in a subsequent call to _findnext or to 
+// _findclose. Otherwise, _findfirst returns –1 and sets errno to one of the following values.
+// EINVAL
+// Invalid parameter: filespec or fileinfo was NULL. Or, the operating system returned an unexpected error.
+// ENOENT
+// File specification that could not be matched.
+// ENOMEM
+// Not enough memory or the file name given was greater than MAX_PATH.
+// EINVAL
+// Invalid file name specification.
+//
+
+
+
+
+#include <stdlib.h>
+#include <wchar.h>
+#include <errno.h> 
+#include "sysif.h"
+#include<e32base.h>
+#include<e32cmn.h>
+#include<ltime.h>
+#define MAXPATHLEN  260 
+#define ATTMASK (_A_ARCH|_A_HIDDEN|_A_NORMAL|_A_RDONLY|_A_SYSTEM|_A_SUBDIR )
+
+class CFindFileByPath : public CBase
+    {
+    public:
+        CFindFileByPath(RFs& aFs) : iFinder(aFs),iLastCount(-1)
+            {  
+            }
+        ~CFindFileByPath()
+            {
+            delete iDir;
+            iDir = NULL;
+            }
+        const TEntry& Entry()
+            {
+            return (*iDir)[iLastCount];
+            }
+        TInt FindFirst(const TDesC&,const TDesC&);
+        TInt FindNext();
+    private:
+        TFindFile iFinder;
+        CDir* iDir;
+        TInt iLastCount;
+        TBuf<MAXPATHLEN> iPath;
+    };
+
+TInt CFindFileByPath::FindFirst(const TDesC &aPattern, const TDesC& aPath)
+    {
+    iPath = aPath;
+    TInt ret = iFinder.FindWildByPath(aPattern,&iPath,iDir);
+    if(ret != KErrNone)
+        {
+        return ret;
+        }
+    return FindNext();
+    }
+
+TInt CFindFileByPath::FindNext()
+    {
+    TInt count = iDir->Count();
+//    Results from the search either in pattern path or in the cwd.
+    if(++iLastCount<count)
+        {
+        return KErrNone;
+        }
+    return KErrNotFound;
+    }
+
+void UpdateFileInfo(struct _wfinddata_t* aFileinfo, CFindFileByPath& aFinder)
+    {
+    wcscpy(aFileinfo->name ,(wchar_t *)aFinder.Entry().iName.Ptr());
+    TInt k = aFinder.Entry().iName.Size()/sizeof(wchar_t);
+    aFileinfo->name[k] = L'\0';
+
+
+    aFileinfo->size = aFinder.Entry().iSize;
+
+    // Unmask unnecessary attributes in iAtt. 
+    // All constant definitions are in sync with what is expected in finddata structure.
+    aFileinfo->attrib = aFinder.Entry().iAtt;    
+    aFileinfo->attrib &= (ATTMASK);
+
+    time_t time_modify = as_time_t(aFinder.Entry().iModified); 
+    aFileinfo->time_write = time_modify;
+
+    aFileinfo->time_create = -1L;
+    aFileinfo->time_access = -1L;
+
+    }
+
+extern "C" 
+{
+     //RFs FileServerSession ; 
+EXPORT_C intptr_t wfindfirst(const wchar_t*  filespec, struct _wfinddata_t* fileinfo)
+ {
+   
+   if(!filespec||!fileinfo)
+   return EINVAL;
+   
+   long handle = -1;    
+   wchar_t *dirf =(wchar_t*)malloc(MAXPATHLEN * sizeof(wchar_t)); // getting the cuurent directory
+   wgetcwd(dirf,MAXPATHLEN);
+   TPtrC16 dird((const TUint16*)dirf); // converting it into descriptor
+   TPtrC16 fsd((const TUint16*)filespec );
+ 
+   CFindFileByPath *temp1= new CFindFileByPath(Backend()->FileSession());    
+   if(temp1== NULL)
+       {
+       return EINVAL;
+       }
+   int k = temp1->FindFirst(fsd,dird);
+   if(k==KErrNone)
+       {        
+       UpdateFileInfo(fileinfo,*temp1);
+       handle = reinterpret_cast<long>(temp1);
+       }
+   else
+       {
+        handle = -1;
+        delete temp1;
+        errno = ENOENT ;
+       }
+   delete dirf; // delete directory pointer 
+   return handle;
+ 
+ }
+
+
+EXPORT_C intptr_t wfindnext(intptr_t handle, struct _wfinddata_t * fileinfo)
+ {
+        if((handle<=0)||!fileinfo)
+    return EINVAL;  
+    
+    CFindFileByPath *temp1 = reinterpret_cast<CFindFileByPath *>(handle); 
+    int k = temp1->FindNext();
+    if(KErrNone==k)
+    {
+    UpdateFileInfo(fileinfo,*temp1);
+    return 0;   
+    }
+    else 
+    {
+        errno = ENOENT ;
+        return -1;
+    }
+ }
+    
+ EXPORT_C int findclose( intptr_t handle)
+ {
+    if(handle <=0)
+    {
+        errno = ENOENT ;
+        return -1;
+    }
+    CFindFileByPath *temp1 = reinterpret_cast<CFindFileByPath *>(handle); 
+    delete temp1;
+    return 0;
+  }
+} 
+