1
#include <filebrowser_formaction.h>
11
#include <sys/types.h>
13
#include <sys/param.h>
14
#include <sys/types.h>
19
namespace newsbeuter {
21
filebrowser_formaction::filebrowser_formaction(view * vv, std::string formstr)
22
: formaction(vv,formstr), quit(false) { }
24
filebrowser_formaction::~filebrowser_formaction() { }
26
void filebrowser_formaction::process_operation(operation op) {
31
GetLogger().log(LOG_DEBUG,"filebrowser_formaction: 'opening' item");
32
std::string focus = f->get_focus();
33
if (focus.length() > 0) {
34
if (focus == "files") {
35
std::string selection = fancy_unquote(f->get("listposname"));
36
char filetype = selection[0];
38
std::string filename(selection);
41
if (type == FBT_OPEN) {
42
snprintf(buf, sizeof(buf), _("Open File - %s"), filename.c_str());
44
snprintf(buf, sizeof(buf), _("Save File - %s"), filename.c_str());
47
::chdir(filename.c_str());
48
f->set("listpos","0");
49
if (type == FBT_SAVE) {
50
char cwdtmp[MAXPATHLEN];
51
::getcwd(cwdtmp,sizeof(cwdtmp));
52
std::string fn(cwdtmp);
53
fn.append(NEWSBEUTER_PATH_SEP);
54
std::string fnstr = f->get("filenametext");
55
const char * base = strrchr(fnstr.c_str(),'/');
59
f->set("filenametext",fn);
65
char cwdtmp[MAXPATHLEN];
66
::getcwd(cwdtmp,sizeof(cwdtmp));
67
std::string fn(cwdtmp);
68
fn.append(NEWSBEUTER_PATH_SEP);
70
f->set("filenametext",fn);
71
f->set_focus("filename");
75
// TODO: show error message
80
std::string fn = f->get("filenametext");
82
if (::stat(fn.c_str(), &sbuf)!=-1 && type == FBT_SAVE) {
84
snprintf(buf,sizeof(buf), _("Do you really want to overwrite `%s' (y:Yes n:No)? "), fn.c_str());
85
f->set_focus("files");
86
if (v->confirm(buf, "yn") == 'n') {
89
f->set_focus("filenametext");
92
v->pop_current_formaction();
98
GetLogger().log(LOG_DEBUG,"view::filebrowser: quitting");
99
v->pop_current_formaction();
100
f->set("filenametext", "");
106
void filebrowser_formaction::prepare() {
108
char cwdtmp[MAXPATHLEN];
109
std::string code = "{list";
110
::getcwd(cwdtmp,sizeof(cwdtmp));
112
DIR * dir = ::opendir(cwdtmp);
114
struct dirent * de = ::readdir(dir);
116
if (strcmp(de->d_name,".")!=0)
117
code.append(add_file(de->d_name));
125
// GetLogger().log(LOG_DEBUG, "filebrowser: code = %s", code.c_str());
126
f->modify("files", "replace_inner", code);
132
void filebrowser_formaction::init() {
133
char cwdtmp[MAXPATHLEN];
134
::getcwd(cwdtmp,sizeof(cwdtmp));
135
std::string cwd = cwdtmp;
137
f->set("fileprompt", _("File: "));
140
std::string save_path = v->get_cfg()->get_configvalue("save-path");
142
GetLogger().log(LOG_DEBUG,"view::filebrowser: save-path is '%s'",save_path.c_str());
147
GetLogger().log(LOG_DEBUG, "view::filebrowser: chdir(%s)", dir.c_str());
149
::chdir(dir.c_str());
150
::getcwd(cwdtmp,sizeof(cwdtmp));
152
f->set("filenametext", default_filename);
155
if (type == FBT_OPEN) {
156
snprintf(buf, sizeof(buf), _("Open File - %s"), cwdtmp);
158
snprintf(buf, sizeof(buf), _("Save File - %s"), cwdtmp);
163
keymap_hint_entry * filebrowser_formaction::get_keymap_hint() {
164
static keymap_hint_entry hints[] = {
165
{ OP_QUIT, _("Cancel") },
166
{ OP_OPEN, _("Save") },
172
std::string filebrowser_formaction::fancy_quote(const std::string& s) {
174
for (unsigned int i=0;i<s.length();++i) {
184
std::string filebrowser_formaction::add_file(std::string filename) {
187
if (::stat(filename.c_str(),&sb)==0) {
189
if (sb.st_mode & S_IFREG)
191
else if (sb.st_mode & S_IFDIR)
193
else if (sb.st_mode & S_IFBLK)
195
else if (sb.st_mode & S_IFCHR)
197
else if (sb.st_mode & S_IFIFO)
199
else if (sb.st_mode & S_IFLNK)
202
std::string rwxbits = get_rwx(sb.st_mode & 0777);
203
std::string owner = "????????", group = "????????";
205
struct passwd * spw = getpwuid(sb.st_uid);
207
owner = spw->pw_name;
208
for (int i=owner.length();i<8;++i) {
212
struct group * sgr = getgrgid(sb.st_gid);
214
group = sgr->gr_name;
215
for (int i=group.length();i<8;++i) {
220
std::ostringstream os;
221
os << std::setw(12) << sb.st_size;
222
std::string sizestr = os.str();
226
line.append(rwxbits);
232
line.append(sizestr);
234
line.append(filename);
236
retval = "{listitem[";
237
retval.append(1,type);
238
retval.append(fancy_quote(filename));
239
retval.append("] text:");
240
retval.append(stfl::quote(line));
246
std::string filebrowser_formaction::fancy_unquote(const std::string& s) {
248
for (unsigned int i=0;i<s.length();++i) {
258
std::string filebrowser_formaction::get_rwx(unsigned short val) {
260
for (int i=0;i<3;++i) {
261
unsigned char bits = val % 8;
265
str = std::string("---") + str;
268
str = std::string("--x") + str;
271
str = std::string("-w-") + str;
274
str = std::string("-wx") + str;
277
str = std::string("r--") + str;
280
str = std::string("r-x") + str;
283
str = std::string("rw-") + str;
286
str = std::string("rwx") + str;