+
+ serv_puts("RDIR");
+ serv_getln(buf, sizeof buf);
+ if (buf[0] == '1') {
+ Files = NewHash(1, NULL);
+ while (serv_getln(buf, sizeof buf), strcmp(buf, "000"))
+ {
+ Entry = (FileListStruct*) malloc(sizeof (FileListStruct));
+
+ Entry->FilenameLen = extract_token(
+ Entry->Filename, buf, 0, '|',
+ sizeof(Entry->Filename));
+ Entry->FileSize = extract_long(buf, 1);
+ Entry->MimeTypeLen = extract_token(
+ Entry->MimeType, buf, 2, '|',
+ sizeof(Entry->MimeType));
+ Entry->CommentLen = extract_token(
+ Entry->Comment, buf, 3, '|',
+ sizeof(Entry->Comment));
+
+ Entry->Sequence = sequence++;
+ Entry->IsPic = (strstr(Entry->MimeType, "image") != NULL);
+ if (!HavePics && Entry->IsPic) {
+ HavePics = 1;
+ *HavePic = 1;
+ }
+ Put(Files, Entry->Filename,
+ Entry->FilenameLen,
+ Entry, NULL);
+ }
+ Order = ibstr("SortOrder");
+ switch (ibstr("SortBy")){
+ case 1: /*NAME*/
+ SortByHashKey(Files,Order);
+ break;
+ case 2: /* SIZE*/
+ SortByPayload(Files, (Order)?
+ CompareFilelistBySize:
+ CompareFilelistBySizeRev);
+ break;
+ case 3: /*MIME*/
+ SortByPayload(Files, (Order)?
+ CompareFilelistByMime:
+ CompareFilelistByMimeRev);
+ break;
+ case 4: /*COMM*/
+ SortByPayload(Files, (Order)?
+ CompareFilelistByComment:
+ CompareFilelistByCommentRev);
+ break;
+ default:
+ SortByPayload(Files, CompareFilelistBySequence);
+ }
+ return Files;
+ }
+ else
+ return NULL;
+}
+
+void FilePrintEntry(const char *FileName, void *vFile, int odd)
+{
+ FileListStruct *File = (FileListStruct*) vFile;
+
+ wprintf("<tr bgcolor=\"#%s\">", (odd ? "DDDDDD" : "FFFFFF"));
+ wprintf("<td>"
+ "<a href=\"download_file/");
+ urlescputs(File->Filename);
+ wprintf("\"><img src=\"display_mime_icon?type=%s\" border=0 align=middle>\n",
+ File->MimeType);
+ escputs(File->Filename); wprintf("</a></td>");
+ wprintf("<td>%ld</td>", File->FileSize);
+ wprintf("<td>"); escputs(File->MimeType); wprintf("</td>");
+ wprintf("<td>"); escputs(File->Comment); wprintf("</td>");
+ wprintf("</tr>\n");
+}
+
+void FilePrintTransition(void *vFile1, void *vFile2, int odd)
+{
+ FileListStruct *File1 = (FileListStruct*) vFile1;
+ FileListStruct *File2 = (FileListStruct*) vFile2;
+ char StartChar[2] = "\0\0";
+ char *SectionName;
+
+ switch (ibstr("SortBy")){
+ case 1: /*NAME*/
+ if ((File2 != NULL) &&
+ ((File1 == NULL) ||
+ (File1->Filename[0] != File2->Filename[0]))) {
+ StartChar[0] = File2->Filename[0];
+ SectionName = StartChar;
+ }
+ else return;
+ break;
+ case 2: /* SIZE*/
+ return;
+ case 3: /*MIME*/
+ return; /*TODO*/
+ break;
+ case 4: /*COMM*/
+ return;
+ default:
+ return;
+ }
+
+ wprintf("<tr bgcolor=\"#%s\"><th colspan = 4>%s</th></tr>",
+ (odd ? "DDDDDD" : "FFFFFF"), SectionName);
+}
+
+
+void display_room_directory(void)
+{