diff --git a/rfb/FileInfo.cxx b/rfb/FileInfo.cxx
index 8d3429f..08e5654 100644
--- a/rfb/FileInfo.cxx
+++ b/rfb/FileInfo.cxx
@@ -30,107 +30,103 @@
 int 
 CompareFileInfo(const void *F, const void *S)
 {
-	FILEINFO *pF = (FILEINFO *) F;
-	FILEINFO *pS = (FILEINFO *) S;
-	if (pF->info.flags == pS->info.flags) {
-		return strcasecmp(pF->name, pS->name);
-	} else {
-		if (pF->info.flags == FT_ATTR_DIR) return -1;
-		if (pS->info.flags == FT_ATTR_DIR)
-			return 1;
-		else
-			return strcasecmp(pF->name, pS->name);
-	}
-	return 0;
+  FILEINFO *pF = (FILEINFO *) F;
+  FILEINFO *pS = (FILEINFO *) S;
+  if (pF->info.flags == pS->info.flags) {
+    return strcasecmp(pF->name, pS->name);
+  } else {
+	if (pF->info.flags == FT_ATTR_DIR) return -1;
+	if (pS->info.flags == FT_ATTR_DIR)
+      return 1;
+	else
+      return strcasecmp(pF->name, pS->name);
+  }
+  
+  return 0;
 }
 
 FileInfo::FileInfo()
 {
-	 m_numEntries = 0;
-	 m_pEntries = NULL;
+  m_numEntries = 0;
+  m_pEntries = NULL;
 }
 
 FileInfo::~FileInfo()
 {
-	free();
+  free();
 }
 
 void 
 FileInfo::add(FileInfo *pFI)
 {
-	m_numEntries = pFI->getNumEntries();
-	FILEINFO *pTemporary = new FILEINFO[m_numEntries];
-	memcpy(pTemporary, pFI->getNameAt(0), m_numEntries * sizeof(FILEINFO));
-	
-	m_pEntries = pTemporary;
-	pTemporary = NULL;
+  m_numEntries = pFI->getNumEntries();
+  FILEINFO *pTemporary = new FILEINFO[m_numEntries];
+  memcpy(pTemporary, pFI->getNameAt(0), m_numEntries * sizeof(FILEINFO));
+  
+  m_pEntries = pTemporary;
+  pTemporary = NULL;
 }
 
 void 
 FileInfo::add(FILEINFO *pFIStruct)
 {
-	add(pFIStruct->name, pFIStruct->info.size, pFIStruct->info.data, pFIStruct->info.flags);
+  add(pFIStruct->name, pFIStruct->info.size, pFIStruct->info.data, pFIStruct->info.flags);
 }
 
 void 
 FileInfo::add(char *pName, unsigned int size, unsigned int data, unsigned int flags)
 {
-	FILEINFO *pTemporary = new FILEINFO[m_numEntries + 1];
-	if (m_numEntries != 0) 
-		memcpy(pTemporary, m_pEntries, m_numEntries * sizeof(FILEINFO));
-
-	strcpy(pTemporary[m_numEntries].name, pName);
-	
-	pTemporary[m_numEntries].info.size = size;
-	pTemporary[m_numEntries].info.data = data;
-	pTemporary[m_numEntries].info.flags = flags;
-
-	if (m_pEntries != NULL) {
-		delete [] m_pEntries;
-		m_pEntries = NULL;
-	}
-	
-	m_pEntries = pTemporary;
-	pTemporary = NULL;
-	m_numEntries++;
+  FILEINFO *pTemporary = new FILEINFO[m_numEntries + 1];
+  if (m_numEntries != 0) 
+    memcpy(pTemporary, m_pEntries, m_numEntries * sizeof(FILEINFO));
+  strcpy(pTemporary[m_numEntries].name, pName);
+  pTemporary[m_numEntries].info.size = size;
+  pTemporary[m_numEntries].info.data = data;
+  pTemporary[m_numEntries].info.flags = flags;
+  if (m_pEntries != NULL) {
+    delete [] m_pEntries;
+    m_pEntries = NULL;
+  }
+  m_pEntries = pTemporary;
+  pTemporary = NULL;
+  m_numEntries++;
 }
 
-
 char *
 FileInfo::getNameAt(unsigned int number)
 {
-	if ((number >= 0) && (number < m_numEntries)) {
-		return m_pEntries[number].name;
-	}
-	return NULL;
+  if ((number >= 0) && (number < m_numEntries)) {
+    return m_pEntries[number].name;
+  }
+  return NULL;
 }
 
 bool 
 FileInfo::setNameAt(unsigned int number, char *pName)
 {
-	if ((number >= 0) && (number < m_numEntries)) {
-		strcpy(m_pEntries[number].name, pName);
-		return true;
-	}
-	return false;
+  if ((number >= 0) && (number < m_numEntries)) {
+    strcpy(m_pEntries[number].name, pName);
+    return true;
+  }
+  return false;
 }
 
 unsigned int
 FileInfo::getSizeAt(unsigned int number)
 {
-	if ((number >= 0) && (number < m_numEntries)) {
-		return m_pEntries[number].info.size;
-	}
-	return 0;
+  if ((number >= 0) && (number < m_numEntries)) {
+    return m_pEntries[number].info.size;
+  }
+  return 0;
 }
 
 unsigned int
 FileInfo::getDataAt(unsigned int number)
 {
-	if ((number >= 0) && (number < m_numEntries)) {
-		return m_pEntries[number].info.data;
-	}
-	return 0;
+  if ((number >= 0) && (number < m_numEntries)) {
+    return m_pEntries[number].info.data;
+  }
+  return 0;
 }
 
 unsigned int
@@ -145,85 +141,85 @@
 FILEINFO * 
 FileInfo::getFullDataAt(unsigned int number)
 {
-	if ((number >= 0) && (number < m_numEntries)) {
-		return &m_pEntries[number];
-	}
-	return NULL;
+  if ((number >= 0) && (number < m_numEntries)) {
+    return &m_pEntries[number];
+  }
+  return NULL;
 }
 	
 bool 
 FileInfo::setSizeAt(unsigned int number, unsigned int value)
 {
-	if ((number >= 0) && (number < m_numEntries)) {
-		m_pEntries[number].info.size = value;
-		return true;
-	}
-	return false;
+  if ((number >= 0) && (number < m_numEntries)) {
+    m_pEntries[number].info.size = value;
+    return true;
+  }
+  return false;
 }
 
 bool 
 FileInfo::setDataAt(unsigned int number, unsigned int value)
 {
-	if ((number >= 0) && (number < m_numEntries)) {
-		m_pEntries[number].info.data = value;
-		return true;
-	}
-	return false;
+  if ((number >= 0) && (number < m_numEntries)) {
+    m_pEntries[number].info.data = value;
+    return true;
+  }
+  return false;
 }
 
 bool 
 FileInfo::setFlagsAt(unsigned int number, unsigned int value)
 {
-	if ((number >= 0) && (number < m_numEntries)) {
-		m_pEntries[number].info.flags = value;
-		return true;
-	}
-	return false;
+  if ((number >= 0) && (number < m_numEntries)) {
+    m_pEntries[number].info.flags = value;
+    return true;
+  }
+  return false;
 }
 
 bool 
 FileInfo::deleteAt(unsigned int number)
 {
-	if ((number >= m_numEntries) || (number < 0)) return false;
-	
-	FILEINFO *pTemporary = new FILEINFO[m_numEntries - 1];
-	
-	if (number == 0) {
-		memcpy(pTemporary, &m_pEntries[1], (m_numEntries - 1) * sizeof(FILEINFO));
-	} else {
-		memcpy(pTemporary, m_pEntries, number * sizeof(FILEINFO));
-		if (number != (m_numEntries - 1)) 
-			memcpy(&pTemporary[number], &m_pEntries[number + 1], (m_numEntries - number - 1) * sizeof(FILEINFO));
-	}
-	
-	if (m_pEntries != NULL) {
-		delete [] m_pEntries;
-		m_pEntries = NULL;
-	}
-	m_pEntries = pTemporary;
-	pTemporary = NULL;
-	m_numEntries--;
-	return true;
+  if ((number >= m_numEntries) || (number < 0)) return false;
+  
+  FILEINFO *pTemporary = new FILEINFO[m_numEntries - 1];
+  
+  if (number == 0) {
+    memcpy(pTemporary, &m_pEntries[1], (m_numEntries - 1) * sizeof(FILEINFO));
+  } else {
+    memcpy(pTemporary, m_pEntries, number * sizeof(FILEINFO));
+    if (number != (m_numEntries - 1)) 
+      memcpy(&pTemporary[number], &m_pEntries[number + 1], (m_numEntries - number - 1) * sizeof(FILEINFO));
+  }
+  
+  if (m_pEntries != NULL) {
+    delete [] m_pEntries;
+    m_pEntries = NULL;
+  }
+  m_pEntries = pTemporary;
+  pTemporary = NULL;
+  m_numEntries--;
+  return true;
 }
-	
+
 unsigned int 
 FileInfo::getNumEntries()
 {
-	return m_numEntries;
+  return m_numEntries;
 }
 
 void 
 FileInfo::sort()
 {
-	qsort(m_pEntries, m_numEntries, sizeof(FILEINFO), CompareFileInfo);
+  qsort(m_pEntries, m_numEntries, sizeof(FILEINFO), CompareFileInfo);
 }
 
 void 
 FileInfo::free()
 {
-	if (m_pEntries != NULL) {
-		delete [] m_pEntries;
-		m_pEntries = NULL;
-	}
-	m_numEntries = 0;
+  if (m_pEntries != NULL) {
+    delete [] m_pEntries;
+    m_pEntries = NULL;
+  }
+  m_numEntries = 0;
 }
