static BOOL is_filter_file(u16 *p_filter, u16 *p_name)
{
  u16 *p_ch = NULL;
  u16 *p_tip = NULL;
  u16 filter[MAX_FILE_PATH] = {0};

  uni_strncpy(filter, p_filter, MAX_FILE_PATH);

  p_tip = uni_strrchr(p_name, 0x2e/*'.'*/);
  if (p_tip == NULL)
  {
    return FALSE;
  }

  while (1)
  {
    p_ch = uni_strrchr(filter, 0x7c/*'|'*/);
    if (p_ch == NULL)
    {
      return FALSE;
    }
    p_ch[0] = 0x2e/*'.'*/;
    if (uni_strcmp(p_ch, p_tip) == 0)
    {
      return TRUE;
    }
    p_ch[0] = 0/*'\0'*/;
  }

  //return FALSE;
}
/*!
 * is enter directory
 */
BOOL ui_video_file_is_enter_dir(void)
{
  u16 *p_temp = NULL;
  u16 parent[4] = {0};
  u16 curn[4] = {0};
  u16 cur_path[255] = {0};

  if(g_video_m.flist_dir != NULL && g_video_m.file_list.file_count != 0)
  {
    uni_strcpy(cur_path, g_video_m.file_list.p_file[0].name);

    p_temp = uni_strrchr(cur_path, 0x5c/*'\\'*/);

    if (p_temp != NULL)
    {
      //parent dir
      str_asc2uni("..", parent);
      str_asc2uni(".", curn);
      if (uni_strlen(p_temp) >= 3 && uni_strcmp(p_temp + 1, parent/*".."*/) == 0)
      {
        p_temp[0] = 0/*'\0'*/;
        p_temp = uni_strrchr(cur_path, 0x5c/*'\\'*/);
        if (p_temp != NULL)
        {
          p_temp[0] = 0/*'\0'*/;
        }
      }
      //cur dir
      else if (uni_strlen(p_temp) >= 2 && uni_strcmp(p_temp + 1, curn/*"."*/) == 0)
      {
        p_temp[0] = 0/*'\0'*/;
      }
      else
      {
        return FALSE;
      }
    }
    else
    {
      return FALSE;
    }
  }
  else
  {
    return FALSE;
  }
  return TRUE;
}
static BOOL is_filter_nodir(u16 *p_filter)
{
  u16 *p_ch = NULL;
  u16 tip[8] = {0};
  u16 filter[MAX_FILE_PATH] = {0};
  u16 nodir[8] = {0};

  uni_strncpy(filter, p_filter, MAX_FILE_PATH);
  str_asc2uni(".nodir", nodir);
  uni_strcpy(tip, nodir);
  while (1)
  {
    p_ch = uni_strrchr(filter, 0x7c/*'|'*/);
    if (p_ch == NULL)
    {
      return FALSE;
    }
    p_ch[0] = 0x2e/*'.'*/;
    if (uni_strcmp(p_ch, tip) == 0)
    {
      return TRUE;
    }
    p_ch[0] = 0/*'\0'*/;
  }

  //return FALSE;
}
Esempio n. 4
0
int OpStringC16::FindLastOf(uni_char aChar) const
{
	if (iBuffer==NULL)
		return KNotFound;
	const uni_char *s = uni_strrchr(iBuffer,aChar);
	if (s==NULL)
		return KNotFound;
	return s-iBuffer;
}
void * flist_add_fav_by_name(u16 *p_name, void **pp_media_fav, media_fav_type_t type)
{
  media_fav_t *p_fav_next = *(media_fav_t **)pp_media_fav;
  u32 next_len = 0;
  u16 *p_tip = NULL;

  CHECK_FAIL_RET_NULL(p_name != NULL);

  if (type == RECORD_FAV)
  {
    next_len = sizeof(rec_fav_t);
  }
  else
  {
    next_len = sizeof(media_fav_t);
  }
  
  while (p_fav_next)
  {
    if (!uni_strcmp(p_name, p_fav_next->path))
    {
      OS_PRINTF("\n##debug: flist_add_fav_by_name [%s] exist!!\n", p_name);
      return p_fav_next;
    }

    if (p_fav_next->p_next == NULL)
    {
      break;
    }
    p_fav_next = p_fav_next->p_next;
  }

  if (p_fav_next)
  {
    p_fav_next->p_next = mtos_malloc(next_len);
    CHECK_FAIL_RET_NULL(p_fav_next->p_next != NULL);
    p_fav_next = p_fav_next->p_next;
  }
  else
  {
    p_fav_next = mtos_malloc(next_len);
    CHECK_FAIL_RET_NULL(p_fav_next != NULL);
    *pp_media_fav = p_fav_next;
  }

  p_fav_next->p_next = NULL;
  memset(p_fav_next, 0, next_len);
  uni_strcpy(p_fav_next->path, p_name);

  if(type != RECORD_FAV)
  {
    p_tip = uni_strrchr(p_fav_next->path, 0x5c/*'\'*/);
    p_fav_next->p_filename = ++ p_tip;
  }
  return p_fav_next;
}
static void check_dir_order(media_file_t *p_file, u32 file_cnt)
{
  s32 loopi = 0;
  u32 ex_index = 0;
  media_file_t file;

  memset(&file, 0, sizeof(media_file_t));

  if (p_file[file_cnt -2].type == DIRECTORY)
  {
    return ;
  }

  for (loopi = file_cnt - 2; loopi >= 0; loopi --)
  {
    if (p_file[loopi].type == DIRECTORY)
    {
      ex_index = loopi + 1;
      break;
    }
  }

  if (loopi == -1)
  {
    ex_index = 0;
  }

  memcpy(&file, &(p_file[file_cnt - 1]), sizeof(media_file_t));
  memcpy(&(p_file[file_cnt - 1]), &(p_file[ex_index]), sizeof(media_file_t));
  memcpy(&(p_file[ex_index]), &file, sizeof(media_file_t));

  p_file[file_cnt - 1].p_name = uni_strrchr(p_file[file_cnt - 1].name, 0x5c/*'\\'*/) + 1;
  p_file[file_cnt - 1].default_order = file_cnt - 1;
  p_file[ex_index].p_name = uni_strrchr(p_file[ex_index].name, 0x5c/*'\\'*/) + 1;
  p_file[ex_index].default_order = ex_index;

}
static u32 get_new_file(file_list_dir_t *p_flist_dir, media_file_t *p_file)
{
  RET_CODE ret = 0;
  vfs_dir_info_t file_info;
  u32 file_cnt = 0;
  u32 fname_len = 0, fpath_len = 0;
  u16 uni_str[8] = {0};

  file_cnt = 0;
  while (file_cnt < p_flist_dir->unit_cnt)
  {
    ret = vfs_readdir (p_flist_dir->cur_dir, &file_info);

    if (ret != SUCCESS)
     //|| file_info.fname[0] == 0)
    {
      OS_PRINTF("\n##debug: ufs_readdir end!\n");
      break;
    }

    fpath_len = uni_strlen(p_flist_dir->cur_path);
    fname_len = uni_strlen(file_info.fname);

    if(fpath_len + fname_len + 1 <  MAX_FILE_PATH)
    {
      memset(p_file[file_cnt].name, 0, MAX_FILE_PATH * sizeof(u16));
      uni_strcpy(p_file[file_cnt].name, p_flist_dir->cur_path);

      if (p_file[file_cnt].name[uni_strlen(p_file[file_cnt].name) - 1] != 0x5c/*'\\'*/)
      {
        uni_str[0] = 0x5c;
        uni_str[1] = 0;
        uni_strcat(p_file[file_cnt].name, uni_str, MAX_FILE_PATH);
      }

      if ((file_info.fattrib & VFS_DIR) && !is_filter_nodir(p_flist_dir->filter))
      {
        uni_str[0] = 0x2e;
        uni_str[1] = 0;
        if (uni_strcmp(file_info.fname, uni_str))
        {
          uni_strcat(p_file[file_cnt].name, file_info.fname, MAX_FILE_PATH);
          p_file[file_cnt].p_name = uni_strrchr(p_file[file_cnt].name, 0x5c/*'\\'*/) + 1;

          p_file[file_cnt].type = DIRECTORY;
          p_file[file_cnt].size = file_info.fsize;
          p_file[file_cnt].default_order = file_cnt;
          file_cnt ++;
          if (file_cnt >= 2)
          {
            check_dir_order(p_file, file_cnt);
          }
        }
      }
      else if (p_flist_dir->filter[0] == 0/*'\0'*/
        || is_filter_file(p_flist_dir->filter, file_info.fname))
      {
        uni_strcat(p_file[file_cnt].name, file_info.fname, MAX_FILE_PATH);
        p_file[file_cnt].p_name = uni_strrchr(p_file[file_cnt].name, 0x5c/*'\\'*/) + 1;
        p_file[file_cnt].type = NOT_DIR_FILE;
        p_file[file_cnt].size = file_info.fsize;
        p_file[file_cnt].default_order = file_cnt;
        file_cnt ++;
      }
    }
  }

  /*for(c**t = 0;  c**t < (file_cnt + 1); c**t ++)
  {
     p_file[c**t].default_order = c**t;
  }*/

  return file_cnt;
}
u32 flist_load_fav(u16 partition_letter, void **pp_media_fav, media_fav_type_t type)
{
  u16 file_name[MAX_FILE_PATH] = {0};
  hfile_t file = NULL;
  vfs_file_info_t file_info = {0};
  u32 read_size = 0;
  u32 fav_cnt = 0;
  media_fav_t *p_media_fav = NULL;
  media_fav_t *p_prev = NULL;
  media_fav_header_t head = {0};
  u32 media_fav_len = 0;
  u16 *p_tip = NULL;
  u8 *p_buffer = NULL;
  u8 *p_r_buf = NULL;
  
  file_name[0] = partition_letter;
  
  switch(type)
  {
    case AUDIO_FAV:
      str_asc2uni(":\\audio_fav_list", file_name + 1);
      media_fav_len = sizeof(media_fav_t);
      break;

    case PIC_FAV:
      str_asc2uni(":\\pic_fav_list", file_name + 1);
      media_fav_len = sizeof(media_fav_t);
      break;

    case RECORD_FAV:
      str_asc2uni(":\\PVRS\\mt_record_list", file_name + 1);
      media_fav_len = sizeof(rec_fav_t);
      break;

    default:
      return 0;
  }
  
  file = vfs_open(file_name, VFS_READ);
  if(file == NULL)
  {
    return 0;
  }

  vfs_get_file_info(file, &file_info);

  if(!file_info.file_size)
  {
    vfs_close(file);
    return 0;
  }

  p_buffer = mtos_align_malloc(file_info.file_size + 4, 16);
  if (p_buffer != NULL)
  {
    memset(p_buffer, 0, file_info.file_size + 4);
    read_size = vfs_read(p_buffer, file_info.file_size, 1, file);
    if (read_size != file_info.file_size)
    {
      mtos_align_free(p_buffer);
      vfs_close(file);
      return 0;
    }
    
    read_size = 0;
    p_r_buf = p_buffer;
    while (read_size < file_info.file_size)
    {
     memcpy((u8 *)(&head), p_r_buf, sizeof(media_fav_header_t));
     p_r_buf += sizeof(media_fav_header_t);
     read_size += sizeof(media_fav_header_t);
      if ((read_size >= file_info.file_size)
        || !head.payload)
      {
        break;
      }
      
      if (head.payload >= media_fav_len)
      {
        break;
      }
      
      p_media_fav = mtos_malloc(media_fav_len);
      CHECK_FAIL_RET_ZERO(p_media_fav != NULL);
      
      memcpy((u8 *)((u32)p_media_fav + 4), p_r_buf, head.payload);
      read_size += head.payload;
      p_r_buf += head.payload;
      p_media_fav->path[0] = partition_letter;
      if((type != RECORD_FAV))
      {
         p_tip = uni_strrchr(p_media_fav->path, 0x5c/*'\\'*/);
         p_media_fav->p_filename = ++ p_tip;
      }
      
      p_media_fav->p_next = NULL;

      if (fav_cnt == 0)
      {
        *pp_media_fav = p_media_fav;
      }
      else
      {
        p_prev->p_next = p_media_fav;
      }
      fav_cnt ++;
      p_prev = p_media_fav;
    }
    mtos_align_free(p_buffer);
    vfs_close(file);
    return fav_cnt;
  }
  
  while (1)
  {
    read_size = vfs_read((u8 *)(&head), sizeof(media_fav_header_t), 1, file);
    if (read_size != sizeof(media_fav_header_t)
      || !head.payload)
    {
      break;
    }
    
    if (head.payload >= media_fav_len)
    {
      break;
    }
    
    p_media_fav = mtos_malloc(media_fav_len);
    CHECK_FAIL_RET_ZERO(p_media_fav != NULL);
    
    read_size = vfs_read((u8 *)p_media_fav + 4, head.payload, 1, file);
    p_media_fav->path[0] = partition_letter;
    if((type != RECORD_FAV))
    {
       p_tip = uni_strrchr(p_media_fav->path, 0x5c/*'\\'*/);
       p_media_fav->p_filename = ++ p_tip;
    }
    
    if (read_size != (media_fav_len - 4))
    {
      break;
    }
    p_media_fav->p_next = NULL;

    if (fav_cnt == 0)
    {
      *pp_media_fav = p_media_fav;
    }
    else
    {
      p_prev->p_next = p_media_fav;
    }
    fav_cnt ++;
    p_prev = p_media_fav;
  }
  
  vfs_close(file);
  return fav_cnt;
}
flist_dir_t flist_open_dir(u16 *p_filter, u16 *p_path, u32 *p_total_cnt)
{
  file_list_priv_t *p_priv = NULL;
  flist_dir_priv_t *p_dir_priv = NULL;
  u16 *p_temp = NULL;
  u16 parent[4] = {0};
  u16 curn[4] = {0};

  CHECK_FAIL_RET_NULL(p_path != NULL);

  p_priv = class_get_handle_by_id(FILE_LIST_CLASS_ID);
  
  if (p_priv->p_opened_dir)
  {
    OS_PRINTF("\n\n\n##waring:please close/leave dir[0x%x] first!\n", p_priv->p_opened_dir);
  }
  p_dir_priv = mtos_malloc(sizeof(flist_dir_priv_t));
  CHECK_FAIL_RET_NULL(p_dir_priv != NULL);
  memset(p_dir_priv, 0, sizeof(flist_dir_priv_t));

  p_dir_priv->p_flist = NULL;
  p_dir_priv->start_idx = 0;
  p_dir_priv->total_cnt = 0;
  
  uni_strcpy(p_dir_priv->cur_path, p_path);

  if (p_filter != NULL)
  {
    uni_strncpy(p_dir_priv->filter, p_filter, MAX_FILE_PATH);
  }

  p_temp = uni_strrchr(p_dir_priv->cur_path, 0x5c/*'\\'*/);

  if (p_temp != NULL)
  {
    //parent dir
    str_asc2uni("..", parent);
    str_asc2uni(".", curn);
    if (uni_strlen(p_temp) >= 3 && uni_strcmp(p_temp + 1, parent/*".."*/) == 0)
    {
      p_temp[0] = 0/*'\0'*/;
      p_temp = uni_strrchr(p_dir_priv->cur_path, 0x5c/*'\\'*/);
      if (p_temp != NULL)
      {
        p_temp[0] = 0/*'\0'*/;
      }
    }
    //cur dir
    else if (uni_strlen(p_temp) >= 2 && uni_strcmp(p_temp + 1, curn/*"."*/) == 0)
    {
      p_temp[0] = 0/*'\0'*/;
    }
  }

  p_dir_priv->vfs_dir = vfs_opendir (p_dir_priv->cur_path, p_priv->max_support_cnt);
  if (p_dir_priv->vfs_dir == NULL)
  {
    mtos_free(p_dir_priv);
    p_dir_priv = NULL;
    return NULL;
  }
  OS_PRINTF("\n##flist read dir please wait...\n");

  flist_reload_dir(p_dir_priv);
  if (p_total_cnt)
  {
    *p_total_cnt = p_dir_priv->total_cnt;
  }
  p_priv->p_opened_dir = p_dir_priv;
  return (flist_dir_t)p_dir_priv;
}
Esempio n. 10
0
static u32 flist_read_dir_one(flist_dir_priv_t *p_flist_dir, media_file_t *p_file)
{
  RET_CODE ret = 0;
  vfs_dir_info_t file_info;
  u32 file_cnt = 0;
  u32 fname_len = 0, fpath_len = 0;
  u16 uni_str[8] = {0};

  while (file_cnt < 1)
  {
    ret = vfs_readdir (p_flist_dir->vfs_dir, &file_info);

    if (ret != SUCCESS)
    {
      OS_PRINTF("\n##debug: ufs_readdir end!\n");
      break;
    }

    fpath_len = uni_strlen(p_flist_dir->cur_path);
    fname_len = uni_strlen(file_info.fname);

    if (fpath_len + fname_len + 1 <  MAX_FILE_PATH)
    {
      if (p_file)
      {
        memset(p_file->name, 0, MAX_FILE_PATH * sizeof(u16));
        uni_strcpy(p_file->name, p_flist_dir->cur_path);

        if (p_file->name[uni_strlen(p_file->name) - 1] != 0x5c/*'\\'*/)
        {
          uni_str[0] = 0x5c;
          uni_str[1] = 0;
          uni_strcat(p_file->name, uni_str, MAX_FILE_PATH);
        }
      }
      
      if ((file_info.fattrib & VFS_DIR) && !is_filter_nodir(p_flist_dir->filter))
      {
        uni_str[0] = 0x2e;
        uni_str[1] = 0;
        if (uni_strcmp(file_info.fname, uni_str))
        {
          if (p_file)
          {
            uni_strcat(p_file->name, file_info.fname, MAX_FILE_PATH);
            p_file->p_name = uni_strrchr(p_file->name, 0x5c/*'\\'*/) + 1;

            p_file->type = DIRECTORY;
            p_file->size = file_info.fsize;
          }
          file_cnt ++;
          break;
        }
      }
      else if ((p_flist_dir->filter[0] == 0 || is_filter_file(p_flist_dir->filter, file_info.fname)))
      {
        if (p_file)
        {
          uni_strcat(p_file->name, file_info.fname, MAX_FILE_PATH);
          p_file->p_name = uni_strrchr(p_file->name, 0x5c/*'\\'*/) + 1;
          p_file->type = NOT_DIR_FILE;
          p_file->size = file_info.fsize;
        }
        file_cnt ++;
        break;
      }
    }
  }

  return file_cnt;
}
Esempio n. 11
0
flist_dir_t file_list_enter_dir(u16 *p_filter, u16 unit_cnt, u16 *p_path)
{
  file_list_priv_t *p_priv = NULL;
  file_list_dir_t *p_flist_dir = NULL;
  u16 *p_temp = NULL;
  u16 parent[4] = {0};
  u16 curn[4] = {0};

  CHECK_FAIL_RET_NULL(p_path != NULL);

  if (unit_cnt == 0)
  {
    return NULL;
  }

  p_priv = class_get_handle_by_id(FILE_LIST_CLASS_ID);

  if (p_priv->p_opened_dir)
  {
    OS_PRINTF("\n\n\n##waring:please close/leave dir[0x%x] first!\n", p_priv->p_opened_dir);
  }
  p_flist_dir = mtos_malloc(sizeof(file_list_dir_t));
  CHECK_FAIL_RET_NULL(p_flist_dir != NULL);
  memset(p_flist_dir, 0, sizeof(file_list_dir_t));

  uni_strcpy(p_flist_dir->cur_path, p_path);

  if (p_filter != NULL)
  {
    uni_strncpy(p_flist_dir->filter, p_filter, MAX_FILE_PATH);
  }

  p_flist_dir->unit_cnt = unit_cnt;

  p_temp = uni_strrchr(p_flist_dir->cur_path, 0x5c/*'\\'*/);

  if (p_temp != NULL)
  {
    //parent dir
    str_asc2uni("..", parent);
    str_asc2uni(".", curn);
    if (uni_strlen(p_temp) >= 3 && uni_strcmp(p_temp + 1, parent/*".."*/) == 0)
    {
      p_temp[0] = 0/*'\0'*/;
      p_temp = uni_strrchr(p_flist_dir->cur_path, 0x5c/*'\\'*/);
      if (p_temp != NULL)
      {
        p_temp[0] = 0/*'\0'*/;
      }
    }
    //cur dir
    else if (uni_strlen(p_temp) >= 2 && uni_strcmp(p_temp + 1, curn/*"."*/) == 0)
    {
      p_temp[0] = 0/*'\0'*/;
    }
  }

  p_flist_dir->cur_dir = vfs_opendir (p_flist_dir->cur_path, unit_cnt);
  if (p_flist_dir->cur_dir == NULL)
  {
    mtos_free(p_flist_dir);
    p_flist_dir = NULL;
  }
  p_priv->p_opened_dir = p_flist_dir;
  return (flist_dir_t)p_flist_dir;
}
Esempio n. 12
0
u16 ui_video_m_get_video_icon(u16 *p_filename)
{
    u16  id    = IM_M_ICON_AVI;
    u16 *p_tip = NULL;
    u8  *p_ext = NULL;

    if(NULL == p_filename)
    {
        return id;
    }

    p_tip = uni_strrchr(p_filename, char_asc2uni('.'));

    if(NULL == p_tip)
    {
        return id;
    }

    p_ext = (u8 *)mtos_malloc(uni_strlen(p_tip) + 1);

    str_uni2asc(p_ext, p_tip);

    if(STRCMPI(p_ext, ".AVI") == 0)
    {
        id = IM_M_ICON_AVI;
    }
    else if(STRCMPI(p_ext, ".MKV") == 0)
    {
        id = IM_M_ICON_MKV;
    }
    else if(STRCMPI(p_ext, ".MP4") == 0)
    {
        id = IM_M_ICON_MP4;
    }
    else if(STRCMPI(p_ext, ".M2TS") == 0)
    {
        id = IM_M_ICON_M2TS;
    }
    else if(STRCMPI(p_ext, ".F4V") == 0)
    {
        id = IM_M_ICON_F4V;
    }  
    else if(STRCMPI(p_ext, ".3GP") == 0)
    {
        id = IM_M_ICON_3GP;
    }  
    else if(STRCMPI(p_ext, ".MOV") == 0)
    {
        id = IM_M_ICON_MOV;
    }  
    else if(STRCMPI(p_ext, ".FLV") == 0)
    {
        id = IM_M_ICON_FLV;
    }  
    else if(STRCMPI(p_ext, ".TS") == 0)
    {
        id = IM_M_ICON_TS;
    }  
    else if(STRCMPI(p_ext, ".MPG") == 0)
    {
        id = IM_M_ICON_MPG;
    }
    mtos_free(p_ext);

    return id;
}
Esempio n. 13
0
OP_STATUS OpFolderListing::GenerateData()
{
#ifdef _LOCALHOST_SUPPORT_
	// Prefix for local files
# ifdef HAS_COMPLEX_GLOBALS
	static const uni_char * const localhost_prefix =
		UNI_L("file://localhost/");
# else
#  define localhost_prefix UNI_L("file://localhost/")
# endif
	static const size_t localhost_prefix_len = 17;
	OP_ASSERT(uni_strlen(localhost_prefix) == localhost_prefix_len);
#endif

	const uni_char * OP_MEMORY_VAR dirend_char = UNI_L("");
#if PATHSEPCHAR != '/'
	const uni_char * OP_MEMORY_VAR displayable_dirend_char = dirend_char;
#else
# define displayable_dirend_char dirend_char
#endif

	// FIXME: OOM - not reported, not checked

	// Set attributes.
	m_url.SetAttribute(URL::KIsDirectoryListing, TRUE);

	// Get the URL and take copies of it for processing.
	OpString base;
	RETURN_IF_ERROR(m_url.GetAttribute(URL::KUniName_Username_Escaped, base));
	m_temp_base = SetNewStr(base.CStr());
	m_displayable_base_url = SetNewStr(base.CStr());
	if (!m_temp_base || !m_displayable_base_url)
	{
		return OpStatus::ERR_NO_MEMORY;
	}

	// Check if this is a local file or not.
#ifdef _LOCALHOST_SUPPORT_
	OP_MEMORY_VAR bool is_local_file = false;
#else
	static const bool is_local_file = false;
#endif
#ifdef _LOCALHOST_SUPPORT_
	if (uni_strncmp(m_displayable_base_url, localhost_prefix, localhost_prefix_len) == 0)
	{
		is_local_file = true;
	}
#endif

	static const uni_char pathsepchar = '/';

	//  If wildchars, remove upto last PATHSEPCHAR/
	unsigned int PathLen = uni_strcspn(m_temp_base, UNI_L(WILDCHARS));
	if (PathLen != uni_strlen(m_temp_base))
	{
		int i;
		for (i = PathLen; i > 0 && m_temp_base[i] != PATHSEPCHAR && m_temp_base[i] != '/' && m_temp_base[i] != '\\' ; i--) {}
		m_temp_base[i] = '\0';
	}

	PathLen = uni_strcspn(m_temp_base,UNI_L("?"));
	m_temp_base[PathLen] = '\0';
	{
		// Ignore parameter portion, but only for the last element to ensure
		// proper path names for FTP and file (anyone using parameters in the
		// parent directories will just have to take their chances).
		uni_char *temp_path = uni_strrchr(m_temp_base, '/'); // don't bother looking for backslash
		if(temp_path)
		{
			uni_char *temp_param = uni_strchr(temp_path, ';');
			if(temp_param)
			{
				PathLen = temp_param - m_temp_base;
				m_temp_base[PathLen] = '\0';
			}
		}
	}

	// If the path does not end in a path separator, add one.
	if (m_temp_base[PathLen-1] != '/'
#if PATHSEPCHAR != '/'
		&& m_temp_base[PathLen-1] != PATHSEPCHAR
#endif
	   )
	{
		dirend_char = UNI_L("/");
#if PATHSEPCHAR != '/'
		if (is_local_file)
		{
			displayable_dirend_char = UNI_L(PATHSEP);
		}
		else
		{
			displayable_dirend_char = dirend_char;
		}
#endif
	}

	// Create a HTML version of the URL string.
	m_htmlified_url = HTMLify_string(m_temp_base);
	if (!m_htmlified_url)
	{
		return OpStatus::ERR_NO_MEMORY;
	}

	// Transmogrify the URL to make it displayable.
	UriUnescape::ReplaceChars(m_displayable_base_url,
		(static_cast<URLType>(m_url.GetAttribute(URL::KType)) == URL_FILE ?
		 UriUnescape::LocalfileUrlUtf8 : UriUnescape::SafeUtf8));

	// Remove localhost prefix
	if (is_local_file)
		op_memmove(m_displayable_base_url, m_displayable_base_url + localhost_prefix_len, UNICODE_SIZE(uni_strlen(m_displayable_base_url + localhost_prefix_len) + 1));

#ifdef SYS_CAP_FILESYSTEM_HAS_DRIVES
	// Clean up the generated path string
	if (is_local_file)
	{
		// Replace Netscape-compatible "|" as drive letter postfix with
		// a drive separator, which we assume to be ":"
		if (m_displayable_base_url[0] &&
		    '|' == m_displayable_base_url[1])
		{
			m_displayable_base_url[1] = ':';
		}

		// Make sure drive letter is upper-cased
		if (Unicode::IsLower(m_displayable_base_url[0]))
		{
			m_displayable_base_url[0] = Unicode::ToUpper(m_displayable_base_url[0]);
		}
	}
#endif

	// Remove formatting characters
	RemoveFormattingCharacters(m_displayable_base_url);

	// Create a HTML version of the displayable URL string.
	m_htmlified_displayable_base_url = HTMLify_string(m_displayable_base_url);
	if (!m_htmlified_displayable_base_url)
	{
		return OpStatus::ERR_NO_MEMORY;
	}

	// Set up the document title from the displayable URL string.
	OpString document_title;
#ifndef SYS_CAP_FILESYSTEM_HAS_DRIVES
	if (is_local_file)
	{
		// Include an initial slash for local files on file systems that do
		// not have drive letters, to avoid blank titles or titles like
		// "usr/bin".
		if (uni_strcmp(m_htmlified_displayable_base_url, localhost_prefix) == 0)
		{
			RETURN_IF_ERROR(document_title.Set("/"));
		}
		else
		{
			RETURN_IF_ERROR(document_title.SetConcat(UNI_L("/"), m_htmlified_displayable_base_url));
		}
	}
	else
#endif
	{
		RETURN_IF_ERROR(document_title.Set(m_htmlified_displayable_base_url));
	}


	// Write the document.
#ifdef _LOCALHOST_SUPPORT_
	OpString dirstyle;
	TRAP_AND_RETURN(rc, g_pcfiles->GetFileURLL(PrefsCollectionFiles::StyleDirFile, &dirstyle));
	RETURN_IF_ERROR(OpenDocument(document_title.CStr(), dirstyle.CStr()));
#else
	RETURN_IF_ERROR(OpenDocument(document_title.CStr(), NULL));
#endif

	m_url.WriteDocumentDataUniSprintf(UNI_L(" <base href=\"%s%s\">\n"), m_htmlified_url, dirend_char);

	RETURN_IF_ERROR(OpenBody(Str::S_FOLDER_LISTING_TEXT));

	RETURN_IF_ERROR(m_url.WriteDocumentData(URL::KNormal, UNI_L("<h2>")));

	// Provide links to each parent directory in the hierarchy.
	size_t len_htmlified = uni_strlen(m_htmlified_url);
	size_t len_displayable = uni_strlen(m_htmlified_displayable_base_url);
	size_t idx_htmlified = 0, idx_displayable = 0;
	uni_char *protocolsuffix = NULL;
	if (NULL != (protocolsuffix = uni_strstr(m_htmlified_url, UNI_L("://"))))
	{
		uni_char *thirdslash = uni_strchr(protocolsuffix + 3, '/');
		if (thirdslash)
		{
			idx_htmlified = thirdslash - m_htmlified_url + 1;
			if(!is_local_file)
			{
				m_url.WriteDocumentDataUniSprintf(UNI_L("<a href=\"%.*s\">%.*s</a>"), idx_htmlified, m_htmlified_url, idx_htmlified, m_htmlified_url);
			}
		}
		else
		{
			idx_htmlified = static_cast<size_t>(-1);
		}
	}
	else
	{
		idx_htmlified = static_cast<size_t>(-1);
	}
	if (NULL != (protocolsuffix = uni_strstr(m_htmlified_displayable_base_url, UNI_L("://"))))
	{
		uni_char *thirdslash = uni_strchr(protocolsuffix + 3, '/');
		if (thirdslash)
		{
			idx_displayable = thirdslash - m_htmlified_displayable_base_url + 1;
		}
	}

	if (static_cast<size_t>(-1) == idx_htmlified)
	{
		m_url.WriteDocumentDataUniSprintf(UNI_L("%s%s</h2>\n\n"),
										  m_htmlified_url, displayable_dirend_char);
	}
	else
	{
#ifndef SYS_CAP_FILESYSTEM_HAS_DRIVES
		if (is_local_file)
		{
			// Add the initial slash manually, as it does not have a
			// left-hand-side component.
			m_url.WriteDocumentDataUniSprintf(UNI_L("<a href=\"%s\">/</a>"), localhost_prefix);
		}
#endif
		while (idx_htmlified < len_htmlified && idx_displayable < len_displayable)
		{
			uni_char *nextslash_htmlified = uni_strchr(m_htmlified_url + idx_htmlified, '/');
			if (!nextslash_htmlified)
			{
				nextslash_htmlified = m_htmlified_url + len_htmlified;
			}
			uni_char *nextslash_displayable =
				uni_strchr(m_htmlified_displayable_base_url + idx_displayable, pathsepchar);
			if (!nextslash_displayable)
			{
				nextslash_displayable = m_htmlified_displayable_base_url + len_displayable;
			}
			int temp_idx_htmlified = nextslash_htmlified - m_htmlified_url;
			int temp_idx_displayable = nextslash_displayable - m_htmlified_displayable_base_url;

			m_url.WriteDocumentDataUniSprintf(UNI_L("<a href=\"%.*s/\">%.*s</a>/"),
											 temp_idx_htmlified, m_htmlified_url,
											 temp_idx_displayable - idx_displayable, &m_htmlified_displayable_base_url[idx_displayable]);

			idx_htmlified = temp_idx_htmlified + 1;
			idx_displayable = temp_idx_displayable + 1;
		}
		m_url.WriteDocumentData(URL::KNormal, UNI_L("</h2>\n\n"));
	}

	// Clean up.
	delete[] m_temp_base; m_temp_base = NULL;
	delete[] m_htmlified_url; m_htmlified_url = NULL;
	delete[] m_displayable_base_url; m_displayable_base_url = NULL;
	delete[] m_htmlified_displayable_base_url; m_htmlified_displayable_base_url = NULL;

	return OpStatus::OK;
}