Merge branch 'master' of git://git.ucc.asn.au/tpg/acess2
[tpg/acess2.git] / Usermode / Libraries / liburi.so_src / main.c
index 2d785f3..e8f8dea 100644 (file)
@@ -32,11 +32,12 @@ void        URI_Close(tURIFile *File);
 size_t URI_file_Read(int Handle, size_t Bytes, void *Buffer);
 size_t URI_file_Write(int Handle, size_t Bytes, void *Buffer);
 void   URI_file_Close(int Handle);
+off_t  URI_file_GetSize(int Handle);
 
 // === CONSTANTS ===
 // Builtin URI protocol handlers
 tURIHandler    caBuiltinHandlers[] = {
-       {"file", 0, URI_file_Open, URI_file_Close, URI_file_Read, URI_file_Write}
+       {"file", 0, URI_file_Open, URI_file_Close, URI_file_Read, URI_file_Write, URI_file_GetSize}
 };
 #define NUM_BUILTIN_HANDLERS   (sizeof(caBuiltinHandlers)/sizeof(caBuiltinHandlers[0]))
 
@@ -55,7 +56,7 @@ tURI *URI_Parse(const char *String)
        if(!String)     return NULL;
        
        protolen = 0;
-       while( isalpha(*tmp)  tmp++, protolen++;
+       while( isalpha(*tmp) || isdigit(*tmp) ) tmp++, protolen++;
        
        // true URI
        if(tmp[0] == ':' && tmp[1] == '/' && tmp[2] == '/')
@@ -75,7 +76,7 @@ tURI *URI_Parse(const char *String)
                if( *tmp == '[' )
                {
                        tmp ++;
-                       while( *tmp != ']' ) {
+                       while( *tmp && *tmp != ']' ) {
                                ret->Host[hostlen] = *tmp;
                                tmp ++;
                                hostlen ++;
@@ -86,7 +87,7 @@ tURI *URI_Parse(const char *String)
                // IPv4/DNS
                else
                {
-                       while( *tmp != '/' && *tmp != ':' )
+                       while( *tmp && *tmp != '/' && *tmp != ':' )
                        {
                                ret->Host[hostlen] = *tmp;
                                tmp ++;
@@ -119,6 +120,7 @@ tURI *URI_Parse(const char *String)
                else {
                        ret->PortStr = NULL;
                        ret->PortNum = -1;
+                       portlen = 0;
                }
                
                if(*tmp == '\0')
@@ -225,6 +227,19 @@ tURIFile *URI_Open(int Mode, tURI *URI)
        return ret;
 }
 
+int URI_GetSize(tURIFile *File, size_t *Size)
+{
+       if( !File || !Size )    return -1;
+       
+       if( File->Handler->GetSize )
+       {
+               *Size = File->Handler->GetSize(File->Handle);
+               return 0;       // Success
+       }
+       
+       return 1;       // Size not avaliable
+}
+
 /**
  * \brief Read from a URI file
  */
@@ -235,7 +250,7 @@ size_t URI_Read(tURIFile *File, size_t Bytes, void *Buffer)
        size_t  tmp;
        
        printf("URI_Read(File=%p, Bytes=%u, Buffer=%p)\n",
-               File, Bytes, Buffer);
+               File, (unsigned int)Bytes, Buffer);
        
        if(!File || !Buffer)    return -1;
        if(Bytes == 0)  return 0;
@@ -301,24 +316,33 @@ int URI_file_Open(char *Host, int Port, char *Path, int Mode)
        if(Mode & URI_MODE_READ)        smode |= OPENFLAG_READ;
        if(Mode & URI_MODE_WRITE)       smode |= OPENFLAG_WRITE;
        
-       printf("URI_file_Open: open('%s', 0x%x)\n", Path, smode);
+//     printf("URI_file_Open: open('%s', 0x%x)\n", Path, smode);
        {
                 int    ret;
-               ret = open(Path, smode);
+               ret = _SysOpen(Path, smode);
                return ret;
        }
 }
 size_t URI_file_Read(int Handle, size_t Bytes, void *Buffer)
 {
-       printf("URI_file_Read: (Handle=%i, Bytes=%i, Buffer=%p)\n",
-               Handle, Bytes, Buffer);
-       return read(Handle, Bytes, Buffer);
+//     printf("URI_file_Read: (Handle=%i, Buffer=%p, Bytes=%i)\n",
+//             Handle, Buffer, (int)Bytes);
+       return _SysRead(Handle, Buffer, Bytes);
 }
 size_t URI_file_Write(int Handle, size_t Bytes, void *Buffer)
 {
-       return write(Handle, Bytes, Buffer);
+       return _SysWrite(Handle, Buffer, Bytes);
 }
 void URI_file_Close(int Handle)
 {
-       close(Handle);
+       _SysClose(Handle);
+}
+off_t URI_file_GetSize(int Handle)
+{
+       uint64_t curpos = _SysTell(Handle);
+       off_t ret;
+       _SysSeek(Handle, 0, SEEK_END);
+       ret = _SysTell(Handle);
+       _SysSeek(Handle, curpos, SEEK_SET);
+       return ret;
 }

UCC git Repository :: git.ucc.asn.au