2 Copyright © 1995-2012, 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.2 (19.8.2012)\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
}
117 static UBYTE
*ParsePatternArg(IPTR
**args
, UWORD ArgNum
);
122 struct FileRequester
*FileReq
;
123 struct WBArg
*WBFiles
;
124 IPTR
*args
[TOTAL_ARGS
] = { NULL
, NULL
, NULL
, NULL
,
125 NULL
, NULL
, NULL
, NULL
,
126 NULL
, NULL
, NULL
, NULL
,
128 int Return_Value
= RETURN_OK
;
134 Buffer
= (char *)AllocVec(MAX_PATH_LEN
, MEMF_ANY
| MEMF_CLEAR
);
137 rda
= ReadArgs(ARG_TEMPLATE
, (IPTR
*)args
, NULL
);
140 FileTags
[ARG_DRAWER
].ti_Data
= (IPTR
)args
[ARG_DRAWER
];
141 FileTags
[ARG_FILE
].ti_Data
= (IPTR
)args
[ARG_FILE
];
142 FileTags
[ARG_PATTERN
].ti_Data
= (IPTR
)args
[ARG_PATTERN
];
143 FileTags
[ARG_TITLE
].ti_Data
= (IPTR
)args
[ARG_TITLE
];
144 FileTags
[ARG_POSITIVE
].ti_Data
= (IPTR
)args
[ARG_POSITIVE
];
145 FileTags
[ARG_NEGATIVE
].ti_Data
= (IPTR
)args
[ARG_NEGATIVE
];
146 ParsePatternArg(args
, ARG_ACCEPTPAT
);
147 ParsePatternArg(args
, ARG_REJECTPAT
);
148 FileTags
[ARG_SAVEMODE
].ti_Data
= (IPTR
)args
[ARG_SAVEMODE
];
149 FileTags
[ARG_MULTISELECT
].ti_Data
= (IPTR
)args
[ARG_MULTISELECT
];
150 FileTags
[ARG_DRAWERSONLY
].ti_Data
= (IPTR
)args
[ARG_DRAWERSONLY
];
151 FileTags
[ARG_NOICONS
].ti_Data
= (IPTR
)args
[ARG_NOICONS
];
152 FileTags
[ARG_PUBSCREEN
].ti_Data
= (IPTR
)args
[ARG_PUBSCREEN
];
153 FileTags
[ARG_PUBSCREEN
+ 1].ti_Data
= args
[ARG_PATTERN
] != NULL
;
154 if (!args
[ARG_INITIALVOLUMES
])
156 FileTags
[ARG_INITIALVOLUMES
+ 1].ti_Tag
= TAG_IGNORE
;
159 FileReq
= (struct FileRequester
*)AllocAslRequest(ASL_FileRequest
,
163 Success
= AslRequest(FileReq
, NULL
);
167 if(!(IPTR
)args
[ARG_MULTISELECT
])
169 strncpy(Buffer
, FileReq
->fr_Drawer
, MAX_PATH_LEN
);
171 /* FileReq->fr_File is NULL when using DRAWERSONLY */
172 Success
= AddPart(Buffer
,
173 FileReq
->fr_File
? FileReq
->fr_File
: (STRPTR
)"",
178 DisplayArgs
[0] = (IPTR
)Buffer
;
179 VPrintf("\"%s\"\n", DisplayArgs
);
184 WBFiles
= FileReq
->fr_ArgList
;
186 for (i
= 0; i
!= FileReq
->fr_NumArgs
; i
++)
188 strncpy(Buffer
, FileReq
->fr_Drawer
, MAX_PATH_LEN
);
190 Success
= AddPart(Buffer
,
196 DisplayArgs
[0] = (IPTR
)Buffer
;
197 VPrintf("\"%s\" ", DisplayArgs
);
210 Return_Value
= RETURN_WARN
;
212 SetIoErr(ERROR_BREAK
);
216 PrintFault(IoErr(), NULL
);
217 Return_Value
= RETURN_FAIL
;
221 FreeAslRequest((struct FileRequester
*)FileReq
);
225 PrintFault(IoErr(), "RequestFile");
226 Return_Value
= RETURN_ERROR
;
233 PrintFault(IoErr(), "RequestFile");
234 Return_Value
= RETURN_ERROR
;
237 FreeVec((APTR
)FileTags
[ARG_ACCEPTPAT
].ti_Data
);
238 FreeVec((APTR
)FileTags
[ARG_REJECTPAT
].ti_Data
);
243 SetIoErr(ERROR_NO_FREE_STORE
);
244 PrintFault(IoErr(), NULL
);
245 Return_Value
= RETURN_FAIL
;
252 static UBYTE
*ParsePatternArg(IPTR
**args
, UWORD ArgNum
)
254 UBYTE
*PatternBuffer
= NULL
;
255 LONG PatternBufferSize
;
256 STRPTR pattern
= (STRPTR
)args
[ArgNum
];
258 PatternBufferSize
= 2 * strlen((char *)pattern
);
259 PatternBuffer
= AllocVec(PatternBufferSize
, MEMF_PUBLIC
);
260 if (PatternBuffer
!= NULL
)
262 if (ParsePatternNoCase((STRPTR
)pattern
,
263 PatternBuffer
, PatternBufferSize
) >= 0)
265 FileTags
[ArgNum
].ti_Data
= (IPTR
)PatternBuffer
;
269 FreeVec(PatternBuffer
);
270 PatternBuffer
= NULL
;
271 FileTags
[ArgNum
].ti_Tag
= TAG_IGNORE
;
275 return PatternBuffer
;