2 Copyright © 1995-2007, The AROS Development Team. All rights reserved.
5 RequestFile CLI command.
8 /*****************************************************************************
16 DRAWER,FILE/K,PATTERN/K,TITLE/K,POSITIVE/K,NEGATIVE/K,
17 ACCEPTPATTERN/K,REJECTPATTERN/K,SAVEMODE/S,MULTISELECT/S,
18 DRAWERSONLY/S,NOICONS/S,PUBSCREEN/K,INITIALVOLUMES/S
26 Creates file requester. The selected files will be displayed separated
27 by spaces. If no file is selected the return code is 5 (warn).
30 DRAWER -- initial content of drawer field
31 FILE -- initial content of file field
32 PATTERN -- content of pattern field (e.g. #?.c)
33 TITLE -- title of the dialog box
34 POSITIVE -- string for the left button
35 NEGATIVE -- string for the right button
36 ACCEPTPATTERN -- only files which match the pattern are displayed
37 REJECTPATTERN -- files which match the pattern aren't displayed
38 SAVEMODE -- requester is displayed as save requester
39 MULTISELECT -- more than one file can be selected
40 DRAWERSONLY -- only drawers are displayed
41 NOICONS -- no icon files (#?.info) are displayed
42 PUBSCREEN -- requester is opened on the given public screen
43 INITIALVOLUMES -- shows the volumes
47 Standard DOS error codes.
59 ******************************************************************************/
61 #include <proto/asl.h>
62 #include <proto/dos.h>
63 #include <proto/exec.h>
66 #include <dos/rdargs.h>
68 #include <dos/dosasl.h>
69 #include <exec/types.h>
70 #include <exec/memory.h>
71 #include <libraries/asl.h>
72 #include <utility/tagitem.h>
73 #include <workbench/startup.h>
77 #define ARG_TEMPLATE "DRAWER,FILE/K,PATTERN/K,TITLE/K,POSITIVE/K," \
78 "NEGATIVE/K,ACCEPTPATTERN/K,REJECTPATTERN/K," \
79 "SAVEMODE/S,MULTISELECT/S,DRAWERSONLY/S," \
80 "NOICONS/S,PUBSCREEN/K,INITIALVOLUMES/S"
82 #define MAX_PATH_LEN 512
85 enum { ARG_DRAWER
= 0, ARG_FILE
, ARG_PATTERN
, ARG_TITLE
, ARG_POSITIVE
,
86 ARG_NEGATIVE
, ARG_ACCEPTPAT
, ARG_REJECTPAT
, ARG_SAVEMODE
,
87 ARG_MULTISELECT
, ARG_DRAWERSONLY
, ARG_NOICONS
, ARG_PUBSCREEN
,
88 ARG_INITIALVOLUMES
, TOTAL_ARGS
};
90 const TEXT version
[] = "$VER: RequestFile 42.1 (18.10.2005)\n";
92 extern struct Library
*AslBase
;
94 struct TagItem FileTags
[] =
96 /* Note: The ordering of these is _important_! */
97 { ASLFR_InitialDrawer
, (IPTR
) NULL
},
98 { ASLFR_InitialFile
, (IPTR
) NULL
},
99 { ASLFR_InitialPattern
, (IPTR
) NULL
},
100 { ASLFR_TitleText
, (IPTR
) NULL
},
101 { ASLFR_PositiveText
, (IPTR
) NULL
},
102 { ASLFR_NegativeText
, (IPTR
) NULL
},
103 { ASLFR_AcceptPattern
, (IPTR
) NULL
},
104 { ASLFR_RejectPattern
, (IPTR
) NULL
},
105 { ASLFR_DoSaveMode
, FALSE
},
106 { ASLFR_DoMultiSelect
, FALSE
},
107 { ASLFR_DrawersOnly
, FALSE
},
108 { ASLFR_RejectIcons
, FALSE
},
109 { ASLFR_PubScreenName
, (IPTR
) NULL
},
110 { ASLFR_DoPatterns
, FALSE
},
111 { ASLFR_InitialShowVolumes
, TRUE
},
112 { TAG_DONE
, (IPTR
) NULL
}
120 struct FileRequester
*FileReq
;
121 struct WBArg
*WBFiles
;
122 IPTR
*args
[TOTAL_ARGS
] = { NULL
, NULL
, NULL
, NULL
,
123 NULL
, NULL
, NULL
, NULL
,
124 NULL
, NULL
, NULL
, NULL
,
126 int Return_Value
= RETURN_OK
;
132 #define DoSave (args[ARG_SAVEMODE] != NULL)
133 #define DoMulti (args[ARG_MULTISELECT] != NULL)
134 #define DoDrawers (args[ARG_DRAWERSONLY] != NULL)
135 #define DoIcons (args[ARG_NOICONS] != NULL)
136 #define DoPattern (args[ARG_PATTERN] != NULL)
138 Buffer
= (char *)AllocVec(MAX_PATH_LEN
, MEMF_ANY
| MEMF_CLEAR
);
141 rda
= ReadArgs(ARG_TEMPLATE
, (IPTR
*)args
, NULL
);
144 FileTags
[ARG_DRAWER
].ti_Data
= (IPTR
)args
[ARG_DRAWER
];
145 FileTags
[ARG_FILE
].ti_Data
= (IPTR
)args
[ARG_FILE
];
146 FileTags
[ARG_PATTERN
].ti_Data
= (IPTR
)args
[ARG_PATTERN
];
147 FileTags
[ARG_TITLE
].ti_Data
= (IPTR
)args
[ARG_TITLE
];
148 FileTags
[ARG_POSITIVE
].ti_Data
= (IPTR
)args
[ARG_POSITIVE
];
149 FileTags
[ARG_NEGATIVE
].ti_Data
= (IPTR
)args
[ARG_NEGATIVE
];
150 FileTags
[ARG_ACCEPTPAT
].ti_Data
= (IPTR
)args
[ARG_ACCEPTPAT
];
151 FileTags
[ARG_REJECTPAT
].ti_Data
= (IPTR
)args
[ARG_REJECTPAT
];
152 FileTags
[ARG_SAVEMODE
].ti_Data
= DoSave
;
153 FileTags
[ARG_MULTISELECT
].ti_Data
= DoMulti
;
154 FileTags
[ARG_DRAWERSONLY
].ti_Data
= DoDrawers
;
155 FileTags
[ARG_NOICONS
].ti_Data
= DoIcons
;
156 FileTags
[ARG_PUBSCREEN
].ti_Data
= (IPTR
)args
[ARG_PUBSCREEN
];
157 FileTags
[ARG_PUBSCREEN
+ 1].ti_Data
= DoPattern
;
158 if (!args
[ARG_INITIALVOLUMES
])
160 FileTags
[ARG_INITIALVOLUMES
+ 1].ti_Tag
= TAG_IGNORE
;
163 FileReq
= (struct FileRequester
*)AllocAslRequest(ASL_FileRequest
,
167 Success
= AslRequest(FileReq
, NULL
);
173 strncpy(Buffer
, FileReq
->fr_Drawer
, MAX_PATH_LEN
);
175 /* FileReq->fr_File is NULL when using DRAWERSONLY */
176 Success
= AddPart(Buffer
,
177 FileReq
->fr_File
? FileReq
->fr_File
: (STRPTR
)"",
182 DisplayArgs
[0] = (IPTR
)Buffer
;
183 VPrintf("\"%s\"\n", DisplayArgs
);
188 WBFiles
= FileReq
->fr_ArgList
;
190 for (i
= 0; i
!= FileReq
->fr_NumArgs
; i
++)
192 strncpy(Buffer
, FileReq
->fr_Drawer
, MAX_PATH_LEN
);
194 Success
= AddPart(Buffer
,
200 DisplayArgs
[0] = (IPTR
)Buffer
;
201 VPrintf("\"%s\" ", DisplayArgs
);
214 Return_Value
= RETURN_WARN
;
216 SetIoErr(ERROR_BREAK
);
220 PrintFault(IoErr(), NULL
);
221 Return_Value
= RETURN_FAIL
;
225 FreeAslRequest((struct FileRequester
*)FileReq
);
229 PrintFault(IoErr(), "RequestFile");
230 Return_Value
= RETURN_ERROR
;
237 PrintFault(IoErr(), "RequestFile");
238 Return_Value
= RETURN_ERROR
;
245 SetIoErr(ERROR_NO_FREE_STORE
);
246 PrintFault(IoErr(), NULL
);
247 Return_Value
= RETURN_FAIL
;