void FileChildWindow::activate_entry(Pane* pane) ///@todo enable using RETURN key accelerator { Entry* entry = pane->_cur; if (!entry) return; WaitCursor wait; if ((entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || // a directory? entry->_down) // a file with NTFS sub-streams? { int scanned_old = entry->_scanned; if (!scanned_old) scan_entry(entry); if (entry->_data.cFileName[0]==TEXT('.') && entry->_data.cFileName[1]==TEXT('\0')) return; if (entry->_data.cFileName[0]==TEXT('.') && entry->_data.cFileName[1]==TEXT('.') && entry->_data.cFileName[2]==TEXT('\0')) { entry = _left->_cur->_up; collapse_entry(_left, entry); goto focus_entry; } else if (entry->_expanded) collapse_entry(pane, _left->_cur); else { expand_entry(_left->_cur); if (!pane->_treePane) focus_entry: { int idx = ListBox_FindItemData(_left_hwnd, ListBox_GetCurSel(_left_hwnd), entry); ListBox_SetCurSel(_left_hwnd, idx); set_curdir(entry); } } if (!scanned_old) { pane->calc_widths(false); pane->set_header(); } } else { entry->launch_entry(_hwnd); } }
int FileChildWindow::Command(int id, int code) { Pane* pane = GetFocus()==_left_hwnd? _left: _right; switch(code) { case LBN_SELCHANGE: { int idx = ListBox_GetCurSel(*pane); Entry* entry = (Entry*) ListBox_GetItemData(*pane, idx); if (pane == _left) set_curdir(entry); else pane->_cur = entry; break;} case LBN_DBLCLK: activate_entry(pane); break; } return 0; }
String FileChildWindow::jump_to_int(LPCTSTR url) { String dir, fname; if (SplitFileSysURL(url, dir, fname)) { Entry* entry = NULL; // call read_tree() to iterate through the hierarchy and open all folders to reach dir if (_root._entry) switch(_root._entry->_etype) { case ET_SHELL: { //@@ separate into FileChildWindow in ShellChildWindow, WinChildWindow, UnixChildWindow ? ShellPath shell_path(dir); entry = _root.read_tree(&*shell_path); break;} #ifdef __WINE__ case ET_UNIX: { LPCTSTR path = dir; if (!_tcsicmp(path, _root._path, _tcslen(_root._path))) path += _tcslen(_root._path); entry = _root.read_tree(path); break;} #endif default: { // ET_NTOBJS, ET_REGISTRY, ET_FAT, ET_WINDOWS LPCTSTR path = dir; if (!_tcsnicmp(path, _root._path, _tcslen(_root._path))) path += _tcslen(_root._path); entry = _root.read_tree(path); break;} } if (entry) { // refresh left pane entries HiddenWindow hide(_left_hwnd); ListBox_ResetContent(_left_hwnd); _left->insert_entries(_root._entry); if (!_header_wdths_ok) { if (_left->calc_widths(false)) { _left->set_header(); _header_wdths_ok = true; } } set_curdir(entry); if (_left_hwnd) { int idx = ListBox_FindItemData(_left_hwnd, -1, entry); if (idx != -1) { // The item should always be found. ListBox_SetCurSel(_left_hwnd, idx); SetFocus(_left_hwnd); } } ///@todo use fname return dir; //FmtString(TEXT("file://%s"), (LPCTSTR)dir); } } return String(); }
FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info) : super(hwnd, info) { CONTEXT("FileChildWindow::FileChildWindow()"); TCHAR drv[_MAX_DRIVE+1]; Entry* entry = NULL; _left = NULL; _right = NULL; switch(info._etype) { #ifdef __WINE__ case ET_UNIX: _root._drive_type = GetDriveType(info._path); _root._sort_order = SORT_NAME; _tsplitpath(info._path, drv, NULL, NULL, NULL); lstrcat(drv, TEXT("/")); lstrcpy(_root._volname, TEXT("root fs")); _root._fs_flags = 0; lstrcpy(_root._fs, TEXT("unixfs")); lstrcpy(_root._path, TEXT("/")); _root._entry = new UnixDirectory(_root._path); entry = _root.read_tree(info._path+_tcslen(_root._path)); break; #endif case ET_NTOBJS: _root._drive_type = DRIVE_UNKNOWN; _root._sort_order = SORT_NAME; _tsplitpath_s(info._path, drv, COUNTOF(drv), NULL, 0, NULL, 0, NULL, 0); lstrcat(drv, TEXT("\\")); lstrcpy(_root._volname, TEXT("NT Object Namespace")); lstrcpy(_root._fs, TEXT("NTOBJ")); lstrcpy(_root._path, drv); _root._entry = new NtObjDirectory(_root._path); entry = _root.read_tree(info._path+_tcslen(_root._path)); break; case ET_REGISTRY: _root._drive_type = DRIVE_UNKNOWN; _root._sort_order = SORT_NONE; _tsplitpath_s(info._path, drv, COUNTOF(drv), NULL, 0, NULL, 0, NULL, 0); lstrcat(drv, TEXT("\\")); lstrcpy(_root._volname, TEXT("Registry")); lstrcpy(_root._fs, TEXT("Registry")); lstrcpy(_root._path, drv); _root._entry = new RegistryRoot(); entry = _root.read_tree(info._path+_tcslen(_root._path)); break; case ET_FAT: { _root._drive_type = DRIVE_UNKNOWN; _root._sort_order = SORT_NONE; _tsplitpath_s(info._path, drv, COUNTOF(drv), NULL, 0, NULL, 0, NULL, 0); lstrcat(drv, TEXT("\\")); lstrcpy(_root._volname, TEXT("FAT XXX")); //@@ lstrcpy(_root._fs, TEXT("FAT")); lstrcpy(_root._path, drv); FATDrive* drive = new FATDrive(TEXT("c:/odyssey-emu/c.img")); //TEXT("\\\\.\\F:")); //@@ if (drive->_hDrive != INVALID_HANDLE_VALUE) { _root._entry = drive; entry = _root.read_tree(info._path+_tcslen(_root._path)); } break;} #ifndef _NO_WIN_FS default: // ET_WINDOWS _root._drive_type = GetDriveType(info._path); _root._sort_order = SORT_NAME; _tsplitpath_s(info._path, drv, COUNTOF(drv), NULL, 0, NULL, 0, NULL, 0); lstrcat(drv, TEXT("\\")); GetVolumeInformation(drv, _root._volname, _MAX_FNAME, 0, 0, &_root._fs_flags, _root._fs, COUNTOF(_root._fs)); lstrcpy(_root._path, drv); _root._entry = new WinDirectory(_root._path); entry = _root.read_tree(info._path+_tcslen(_root._path)); break; #else default: #endif case ET_SHELL: { //@@ separate FileChildWindow into ShellChildWindow, WinChildWindow, UnixChildWindow ? _root._drive_type = DRIVE_UNKNOWN; _root._sort_order = SORT_NAME; lstrcpy(drv, TEXT("\\")); lstrcpy(_root._volname, TEXT("Desktop")); _root._fs_flags = 0; lstrcpy(_root._fs, TEXT("Shell")); _root._entry = new ShellDirectory(GetDesktopFolder(), DesktopFolderPath(), hwnd); const ShellChildWndInfo& shell_info = static_cast<const ShellChildWndInfo&>(info); entry = _root.read_tree(&*shell_info._shell_path); break;} } if (_root._entry) { if (info._etype != ET_SHELL) wsprintf(_root._entry->_data.cFileName, TEXT("%s - %s"), drv, _root._fs); /*@@else lstrcpy(_root._entry->_data.cFileName, TEXT("GetDesktopFolder"));*/ _root._entry->_data.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; ///@todo use OWM_ROOTED flag if (info._open_mode & OWM_EXPLORE) ///@todo Is not-explore-mode for FileChildWindow completely implemented? _left_hwnd = *(_left=new Pane(_hwnd, IDW_TREE_LEFT, IDW_HEADER_LEFT, _root._entry, true, COL_CONTENT)); _right_hwnd = *(_right=new Pane(_hwnd, IDW_TREE_RIGHT, IDW_HEADER_RIGHT, NULL, false, COL_TYPE|COL_SIZE|COL_DATE|COL_TIME|COL_ATTRIBUTES|COL_INDEX|COL_LINKS|COL_CONTENT)); } _header_wdths_ok = false; if (!_left_hwnd && !_right_hwnd) return; if (entry) set_curdir(entry); else if (_root._entry) set_curdir(_root._entry); if (_left_hwnd) { int idx = ListBox_FindItemData(_left_hwnd, ListBox_GetCurSel(_left_hwnd), _left->_cur); ListBox_SetCurSel(_left_hwnd, idx); //SetFocus(_left_hwnd); } // store path into history if (info._path && *info._path) _url_history.push(info._path); }
int main (int argc, char *argv []) { int argn; /* Argument number */ Bool args_ok = TRUE, /* Were the arguments okay? */ quiet_mode = FALSE, /* -q means suppress messages */ background = FALSE; /* -s means run in background */ char *workdir, /* Working directory */ *port, /* Value for listen port */ **argparm; /* Argument parameter to pick-up */ /* First off, switch to user's id */ set_uid_user (); /* These are the arguments we may get on the command line */ workdir = NULL; port = NULL; argparm = NULL; /* Argument parameter to pick-up */ for (argn = 1; argn < argc; argn++) { /* If argparm is set, we have to collect an argument parameter */ if (argparm) { if (*argv [argn] != '-') /* Parameter can't start with '-' */ { *argparm = strdupl (argv [argn]); argparm = NULL; } else { args_ok = FALSE; break; } } else if (*argv [argn] == '-') { switch (argv [argn][1]) { /* These switches take a parameter */ case 'w': argparm = &workdir; break; case 'p': argparm = &port; break; /* These switches have an immediate effect */ case 'q': quiet_mode = TRUE; break; case 's': background = TRUE; break; case 'S': background = FALSE; break; case 't': smtsock_trace (TRUE); break; case 'v': coprintf ("Sysman %s", SYSMAN_VERSION); coprintf (PRODUCT); coprintf (BUILDMODEL); coprintf (COPYRIGHT); coprintf ("Built on: %s", BUILDDATE); exit (EXIT_SUCCESS); case 'h': coprintf ("Sysman %s", SYSMAN_VERSION); coprintf (COPYRIGHT); coprintf (USAGE); exit (EXIT_SUCCESS); /* Anything else is an error */ default: args_ok = FALSE; } } else { args_ok = FALSE; break; } } /* If there was a missing parameter or an argument error, quit */ if (argparm) { puts ("Argument missing - type 'sysman -h' for help"); exit (EXIT_FAILURE); } else if (!args_ok) { puts ("Invalid arguments - type 'sysman -h' for help"); exit (EXIT_FAILURE); } /* Set server working directory if necessary */ if (workdir && set_curdir (workdir)) { printf ("Can't work in '%s' - %s\n", workdir, strerror (errno)); exit (EXIT_FAILURE); } /* Handle the remaining arguments we got */ if (!port) port = SYSMAN_DEFAULT_PORT; if (quiet_mode) { fclose (stdout); /* Kill standard output */ fclose (stderr); /* and standard error */ } else { puts ("Sysman " SYSMAN_VERSION); puts (COPYRIGHT); } if (background) { const char *background_args [] = { "-s", NULL }; puts ("Moving into the background"); if (process_server (NULL, NULL, argc, argv, background_args) != 0) { puts ("Backgrounding failed. Giving up."); exit (EXIT_FAILURE); } } smt_init (); /* Initialise SMT kernel */ if (sysmana_init (port) == 0) /* Initialise SYSMAN agent */ smt_exec_full (); /* Run until completed */ else printf ("Initialisation error\n"); smt_term (); /* Shut-down SMT kernel */ mem_assert (); return (EXIT_SUCCESS); }
int main (int argc, char *argv []) { int argn; /* Argument number */ Bool args_ok = TRUE, /* Were the arguments okay? */ quiet_mode = FALSE; /* -q means suppress messages */ char *workdir, /* Working directory */ *rootdir, /* Default root directory */ *cgidir, /* CGI program directory */ *ftproot, /* Default FTP root directory */ *portbase, /* Value for IP portbase */ *background, /* -s means run in background */ **argparm; /* Argument parameter to pick-up */ /* First off, switch to user's id */ set_uid_user (); /* These are the arguments we may get on the command line */ workdir = NULL; rootdir = NULL; cgidir = NULL; portbase = NULL; background = NULL; ftproot = NULL; argparm = NULL; /* Argument parameter to pick-up */ for (argn = 1; argn < argc; argn++) { /* If argparm is set, we have to collect an argument parameter */ if (argparm) { if (*argv [argn] != '-') /* Parameter can't start with '-' */ { *argparm = strdupl (argv [argn]); argparm = NULL; } else { args_ok = FALSE; break; } } else if (*argv [argn] == '-') { switch (argv [argn][1]) { /* These switches take a parameter */ case 'w': argparm = &workdir; break; case 'r': argparm = &rootdir; break; case 'c': argparm = &cgidir; break; case 'b': argparm = &portbase; break; case 'f': argparm = &ftproot; break; /* These switches have an immediate effect */ case 'q': quiet_mode = TRUE; break; case 's': background = "1"; break; case 'S': background = "0"; break; case 't': smtsock_trace (TRUE); break; case 'v': coprintf (PRODUCT); coprintf (BUILDMODEL); coprintf (COPYRIGHT); coprintf ("Built on: %s", BUILDDATE); exit (EXIT_SUCCESS); case 'h': coprintf (SERVER_NAME); coprintf (COPYRIGHT); coprintf (USAGE); exit (EXIT_SUCCESS); /* Anything else is an error */ default: args_ok = FALSE; } } else { args_ok = FALSE; break; } } /* If there was a missing parameter or an argument error, quit */ if (argparm) { puts ("Argument missing - type 'xitami -h' for help"); exit (EXIT_FAILURE); } else if (!args_ok) { puts ("Invalid arguments - type 'xitami -h' for help"); exit (EXIT_FAILURE); } /* Set server working directory if necessary */ if (workdir && set_curdir (workdir)) { printf ("Can't work in '%s' - %s\n", workdir, strerror (errno)); exit (EXIT_FAILURE); } /* Load configuration data, if any, into the config_table */ config = ini_dyn_load (NULL, "xitami.cfg"); ini_dyn_load (config, CONFIG ("server:defaults")); /* Initialise arguments, taking defaults from the config_table */ if (!rootdir) rootdir = CONFIG ("server:webpages"); if (!cgidir) cgidir = CONFIG ("server:cgi-bin"); if (!portbase) portbase = CONFIG ("server:portbase"); if (!background) background = CONFIG ("server:background"); if (!ftproot) ftproot = CONFIG ("ftp:root"); /* Now, handle the remaining arguments we got */ ip_portbase = atoi (portbase); if (quiet_mode) { fclose (stdout); /* Kill standard output */ fclose (stderr); /* and standard error */ } else { puts (SERVER_NAME); puts (COPYRIGHT); } if (*background == '1') { const char *background_args [] = { "-s", NULL }; puts ("Moving into the background"); if (process_server (NULL, NULL, argc, argv, background_args) != 0) { puts ("Backgrounding failed. Giving up."); exit (EXIT_FAILURE); } } /* Initialise the SMT kernel */ smt_init (); server_name = "Xitami"; /* Load the agents we want to use */ if (*CONFIG ("lrwp:enabled") == '1') xilrwp_init (); /* LRWP service agent */ if (*CONFIG ("security:admin") == '1') xiadmin_init (); /* Administration agent */ if (*CONFIG ("server:supervisor") == '1') xisuper_init (); /* Supervisor agent */ xierror_init (); /* Error-simulation agent */ xiredir_init (); /* Redirection agent */ xiddns_init (); /* Dynamic DNS registration */ xiimap_init (); /* Image mapping agent */ xixlog_init (); /* Extended logging agent */ xixssi_init (); /* Internal SSI processor */ xixxml_init (); /* Internal XML processor */ smthttp_init (rootdir, cgidir); /* HTTP agent, required */ smtftpc_init (ftproot); /* FTP service agent */ smtpipe_init (CONFIG ("server:pipedef")); /* Transfer pipe agent */ smt_exec_full (); /* Run SMT until completed */ smt_term (); /* Deallocate configuration symbol table */ sym_delete_table (config); /* Check that all memory was cleanly released */ mem_assert (); return (EXIT_SUCCESS); }