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);
+size_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]))
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] == '/')
if( *tmp == '[' )
{
tmp ++;
- while( *tmp != ']' ) {
+ while( *tmp && *tmp != ']' ) {
ret->Host[hostlen] = *tmp;
tmp ++;
hostlen ++;
// IPv4/DNS
else
{
- while( *tmp != '/' && *tmp != ':' )
+ while( *tmp && *tmp != '/' && *tmp != ':' )
{
ret->Host[hostlen] = *tmp;
tmp ++;
else {
ret->PortStr = NULL;
ret->PortNum = -1;
+ portlen = 0;
}
if(*tmp == '\0')
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
*/
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;
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);
}
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 read(Handle, Buffer, Bytes);
}
size_t URI_file_Write(int Handle, size_t Bytes, void *Buffer)
{
- return write(Handle, Bytes, Buffer);
+ return write(Handle, Buffer, Bytes);
}
void URI_file_Close(int Handle)
{
close(Handle);
}
+size_t URI_file_GetSize(int Handle)
+{
+ uint64_t curpos = tell(Handle);
+ size_t ret;
+ seek(Handle, 0, SEEK_END);
+ ret = tell(Handle);
+ seek(Handle, curpos, SEEK_SET);
+ return ret;
+}