mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-08-05 04:44:19 -04:00
Changes to bring the SSH Menu system online!
* Commandline Options added (./retroshare-nogui -h for help). * Added Password Hash system. * Shifted Menu output to std::string buffers. * Built interface to SSH server. * changed menus to lowercase. * Fixed SSH server restart issue. * Updates Output regularly now. git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.5-gxs-b1@5398 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
fa65173171
commit
8f2ff3eaf5
10 changed files with 814 additions and 186 deletions
|
@ -6,48 +6,59 @@
|
|||
|
||||
#include <iostream>
|
||||
|
||||
#include "util/rsstring.h"
|
||||
|
||||
/**********************************************************
|
||||
* Menu Base Interface.
|
||||
*/
|
||||
|
||||
int tailrec_printparents(Menu *m, std::ostream &out)
|
||||
// RsTermServer Interface.
|
||||
void MenuInterface::reset()
|
||||
{
|
||||
mBase->reset();
|
||||
mCurrentMenu = mBase;
|
||||
mInputRequired = false;
|
||||
}
|
||||
|
||||
int MenuInterface::tick(bool haveInput, char keypress, std::string &output)
|
||||
{
|
||||
if (!haveInput)
|
||||
{
|
||||
/* make a harmless key */
|
||||
keypress = ' ';
|
||||
}
|
||||
|
||||
if ((mInputRequired) && (!haveInput))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
uint32_t rt = process(keypress, mDrawFlags, output);
|
||||
mInputRequired = (rt == MENU_PROCESS_NEEDDATA);
|
||||
|
||||
if (rt == MENU_PROCESS_QUIT)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int tailrec_printparents(Menu *m, std::string &buffer)
|
||||
{
|
||||
Menu *p = m->parent();
|
||||
if (p)
|
||||
{
|
||||
tailrec_printparents(p, out);
|
||||
tailrec_printparents(p, buffer);
|
||||
}
|
||||
out << m->ShortFnDesc() << " => ";
|
||||
|
||||
#if 0
|
||||
MenuList *ml = dynamic_cast<MenuList *>(m);
|
||||
MenuOpBasicKey *mbk = dynamic_cast<MenuOpBasicKey *>(m);
|
||||
MenuOpTwoKeys *mtk = dynamic_cast<MenuOpTwoKeys *>(m);
|
||||
|
||||
if (ml)
|
||||
{
|
||||
out << "MenuList@" << (void *) m << " ";
|
||||
}
|
||||
else if (mbk)
|
||||
{
|
||||
out << "MenuBasicKey@" << (void *) m << " ";
|
||||
}
|
||||
else if (mtk)
|
||||
{
|
||||
out << "MenuOpTwoKeys@" << (void *) m << " ";
|
||||
}
|
||||
else
|
||||
{
|
||||
out << "Menu@" << (void *) m << " ";
|
||||
}
|
||||
#endif
|
||||
|
||||
buffer += m->ShortFnDesc();
|
||||
buffer += " => ";
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
uint32_t MenuInterface::process(char key)
|
||||
uint32_t MenuInterface::process(char key, uint32_t drawFlags, std::string &buffer)
|
||||
{
|
||||
|
||||
#ifdef MENU_DEBUG
|
||||
|
@ -66,18 +77,23 @@ uint32_t MenuInterface::process(char key)
|
|||
std::cout << std::endl;
|
||||
#endif // MENU_DEBUG
|
||||
|
||||
switch(rt)
|
||||
|
||||
uint32_t base_rt = (rt & MENU_PROCESS_MASK);
|
||||
bool needData = (rt & MENU_PROCESS_NEEDDATA);
|
||||
switch(base_rt)
|
||||
{
|
||||
case MENU_PROCESS_NONE:
|
||||
if (needData)
|
||||
{
|
||||
/* no redraw, this could be called many times */
|
||||
doRedraw = false;
|
||||
}
|
||||
break;
|
||||
|
||||
case MENU_PROCESS_DONE:
|
||||
/* no changes - operation performed, or noop */
|
||||
break;
|
||||
|
||||
case MENU_PROCESS_NEEDDATA:
|
||||
/* no redraw, this could be called many times */
|
||||
doRedraw = false;
|
||||
break;
|
||||
|
||||
case MENU_PROCESS_ERROR:
|
||||
/* Show Error at top of Page */
|
||||
showError = true;
|
||||
|
@ -114,6 +130,11 @@ uint32_t MenuInterface::process(char key)
|
|||
break;
|
||||
}
|
||||
|
||||
if (drawFlags & MENU_DRAW_FLAGS_ECHO)
|
||||
{
|
||||
buffer += key;
|
||||
}
|
||||
|
||||
/* now we redraw, and wait for next data */
|
||||
if (!doRedraw)
|
||||
{
|
||||
|
@ -123,7 +144,7 @@ uint32_t MenuInterface::process(char key)
|
|||
/* HEADER */
|
||||
for(int i = 0; i < 20; i++)
|
||||
{
|
||||
std::cout << std::endl;
|
||||
buffer += "\r\n";
|
||||
}
|
||||
|
||||
/* ERROR */
|
||||
|
@ -138,17 +159,19 @@ uint32_t MenuInterface::process(char key)
|
|||
}
|
||||
|
||||
/* MENU PAGE */
|
||||
drawHeader();
|
||||
mCurrentMenu->drawPage();
|
||||
return MENU_PROCESS_NEEDDATA;
|
||||
drawHeader(drawFlags, buffer);
|
||||
mCurrentMenu->drawPage(drawFlags, buffer);
|
||||
|
||||
if (needData)
|
||||
return MENU_PROCESS_NEEDDATA;
|
||||
|
||||
return MENU_PROCESS_NONE;
|
||||
}
|
||||
|
||||
uint32_t MenuInterface::drawHeader()
|
||||
uint32_t MenuInterface::drawHeader(uint32_t drawFlags, std::string &buffer)
|
||||
{
|
||||
std::cout << "=======================================================";
|
||||
std::cout << std::endl;
|
||||
std::cout << "Retroshare Terminal Menu V2.xxxx ======================";
|
||||
std::cout << std::endl;
|
||||
buffer += "=======================================================\r\n";
|
||||
buffer += "Retroshare Terminal Menu V2.xxxx ======================\r\n";
|
||||
|
||||
unsigned int nTotal = 0;
|
||||
unsigned int nConnected = 0;
|
||||
|
@ -200,18 +223,19 @@ uint32_t MenuInterface::drawHeader()
|
|||
float upKb = 0;
|
||||
rsicontrol -> ConfigGetDataRates(downKb, upKb);
|
||||
|
||||
std::cout << "Friends " << nConnected << "/" << nTotal;
|
||||
std::cout << " Network: " << natState;
|
||||
std::cout << std::endl;
|
||||
std::cout << "Down: " << downKb << " (kB/s) ";
|
||||
std::cout << " Up: " << upKb << " (kB/s) ";
|
||||
std::cout << std::endl;
|
||||
std::cout << "Menu State: ";
|
||||
tailrec_printparents(mCurrentMenu, std::cout);
|
||||
std::cout << std::endl;
|
||||
rs_sprintf_append(buffer, "Friends %d / %d Network: %s\r\n",
|
||||
nConnected, nTotal, natState.c_str());
|
||||
|
||||
std::cout << "=======================================================";
|
||||
std::cout << std::endl;
|
||||
rs_sprintf_append(buffer, "Down: %2.2f Up %2.2f\r\n", downKb, upKb);
|
||||
|
||||
std::string menuState;
|
||||
tailrec_printparents(mCurrentMenu, menuState);
|
||||
|
||||
buffer += "Menu State: ";
|
||||
buffer += menuState;
|
||||
buffer += "\r\n";
|
||||
|
||||
buffer += "=======================================================\r\n";
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -251,6 +275,16 @@ int Menu::addMenuItem(char key, Menu *child)
|
|||
return 1;
|
||||
}
|
||||
|
||||
void Menu::reset()
|
||||
{
|
||||
mSelectedMenu = NULL;
|
||||
std::map<uint8_t, Menu *>::iterator it;
|
||||
for(it = mChildren.begin(); it != mChildren.end(); it++)
|
||||
{
|
||||
it->second->reset();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
uint32_t Menu::process(char key)
|
||||
{
|
||||
|
@ -309,11 +343,11 @@ uint32_t Menu::process_children(char key)
|
|||
/* now return, depending on type */
|
||||
switch(it->second->op())
|
||||
{
|
||||
/* Think I can handle these the same! Both will call DrawPage,
|
||||
* then Process on New Menu
|
||||
*/
|
||||
|
||||
case MENU_OP_NEEDDATA:
|
||||
setSelectedMenu(it->second);
|
||||
return MENU_PROCESS_MENU | MENU_PROCESS_NEEDDATA;
|
||||
break;
|
||||
|
||||
case MENU_OP_SUBMENU:
|
||||
setSelectedMenu(it->second);
|
||||
return MENU_PROCESS_MENU;
|
||||
|
@ -335,31 +369,40 @@ uint32_t Menu::process_children(char key)
|
|||
}
|
||||
|
||||
|
||||
uint32_t Menu::drawPage()
|
||||
uint32_t Menu::drawPage(uint32_t drawFlags, std::string &buffer)
|
||||
{
|
||||
std::cout << "Universal Commands ( ";
|
||||
std::cout << (char) MENU_KEY_QUIT << ":Quit ";
|
||||
std::cout << (char) MENU_KEY_HELP << ":Help ";
|
||||
std::cout << (char) MENU_KEY_TOP << ":Top ";
|
||||
std::cout << (char) MENU_KEY_UP << ":Up ";
|
||||
std::cout << ")";
|
||||
std::cout << std::endl;
|
||||
buffer += "Universal Commands ( ";
|
||||
if (!(drawFlags & MENU_DRAW_FLAGS_NOQUIT))
|
||||
{
|
||||
buffer += (char) MENU_KEY_QUIT;
|
||||
buffer += ":Quit ";
|
||||
}
|
||||
buffer += (char) MENU_KEY_HELP;
|
||||
buffer += ":Help ";
|
||||
buffer += (char) MENU_KEY_TOP;
|
||||
buffer += ":Top ";
|
||||
buffer += (char) MENU_KEY_UP;
|
||||
buffer += ":Up ";
|
||||
buffer += ")";
|
||||
buffer += "\r\n";
|
||||
|
||||
std::cout << "Specific Commands (";
|
||||
buffer += "Specific Commands ( ";
|
||||
std::map<uint8_t, Menu *>::iterator it;
|
||||
for(it = mChildren.begin(); it != mChildren.end(); it++)
|
||||
{
|
||||
std::cout << (char) it->first << ":";
|
||||
std::cout << it->second->ShortFnDesc() << " ";
|
||||
buffer += (char) it->first;
|
||||
buffer += ":";
|
||||
buffer += it->second->ShortFnDesc();
|
||||
buffer += " ";
|
||||
}
|
||||
std::cout << ")";
|
||||
std::cout << std::endl;
|
||||
buffer += ")";
|
||||
buffer += "\r\n";
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
uint32_t Menu::drawHelpPage()
|
||||
uint32_t Menu::drawHelpPage(uint32_t drawFlags, std::string &buffer)
|
||||
{
|
||||
std::cout << "Menu Help: Universal Commands are:";
|
||||
std::cout << std::endl;
|
||||
|
@ -391,22 +434,20 @@ uint32_t Menu::drawHelpPage()
|
|||
*/
|
||||
|
||||
|
||||
uint32_t MenuList::drawPage()
|
||||
uint32_t MenuList::drawPage(uint32_t drawFlags, std::string &buffer)
|
||||
{
|
||||
Menu::drawPage();
|
||||
Menu::drawPage(drawFlags, buffer);
|
||||
|
||||
std::cout << "Navigation Commands (";
|
||||
//std::cout << (char) MENULIST_KEY_LIST << ":List ";
|
||||
std::cout << (char) MENULIST_KEY_NEXT << ":Next ";
|
||||
std::cout << (char) MENULIST_KEY_PREV << ":Prev ";
|
||||
std::cout << ")";
|
||||
std::cout << std::endl;
|
||||
buffer += "Navigation Commands (";
|
||||
buffer += (char) MENULIST_KEY_NEXT;
|
||||
buffer += ":Next ";
|
||||
buffer += (char) MENULIST_KEY_PREV;
|
||||
buffer += ":Prev ";
|
||||
buffer += ")";
|
||||
buffer += "\r\n";
|
||||
|
||||
std::cout << "MenuList::Internals ";
|
||||
std::cout << "ListSize: " << getListCount();
|
||||
std::cout << " SelectIdx: " << mSelectIdx;
|
||||
std::cout << " Cursor: " << mCursor;
|
||||
std::cout << std::endl;
|
||||
rs_sprintf_append(buffer, "MenuList::Internals ListSize: %d, SelectIdx: %d Cursor: %d\r\n",
|
||||
getListCount(), mSelectIdx, mCursor);
|
||||
|
||||
int i = 0;
|
||||
|
||||
|
@ -420,28 +461,28 @@ uint32_t MenuList::drawPage()
|
|||
|
||||
if (mSelectIdx >= 0)
|
||||
{
|
||||
std::cout << "Current Selection Idx: " << mSelectIdx << " : ";
|
||||
|
||||
rs_sprintf_append(buffer, "Current Selection Idx: %d : ", mSelectIdx);
|
||||
std::string desc;
|
||||
if (getEntryDesc(mSelectIdx, desc) & (desc != ""))
|
||||
{
|
||||
std::cout << desc;
|
||||
buffer += desc;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Missing Description";
|
||||
buffer += "Missing Description";
|
||||
}
|
||||
std::cout << std::endl;
|
||||
buffer += "\r\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "No Current Selection: Use 0 - 9 to choose an Entry";
|
||||
std::cout << std::endl;
|
||||
buffer += "No Current Selection: Use 0 - 9 to choose an Entry";
|
||||
buffer += "\r\n";
|
||||
}
|
||||
|
||||
|
||||
std::cout << "Showing " << startCount;
|
||||
std::cout << " to " << endCount << " of " << listCount << " Entries";
|
||||
std::cout << std::endl;
|
||||
rs_sprintf_append(buffer, "Showing %d to %d of %d Entries\r\n",
|
||||
startCount, endCount, listCount);
|
||||
|
||||
std::list<std::string>::iterator it;
|
||||
for (it = mList.begin(); it != mList.end(); it++, i++)
|
||||
|
@ -451,32 +492,35 @@ uint32_t MenuList::drawPage()
|
|||
{
|
||||
if (i == mSelectIdx)
|
||||
{
|
||||
std::cout << "SELECTED => (" << curIdx << ") ";
|
||||
rs_sprintf_append(buffer, "SELECTED (%d) ", curIdx);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "\t(" << curIdx << ") ";
|
||||
rs_sprintf_append(buffer, "\t(%d) ", curIdx);
|
||||
}
|
||||
std::string desc;
|
||||
if (getEntryDesc(i, desc) & (desc != ""))
|
||||
{
|
||||
std::cout << desc;
|
||||
buffer += desc;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << *it << " => ";
|
||||
std::cout << "Missing Description";
|
||||
buffer += *it;
|
||||
buffer += " => ";
|
||||
buffer += "Missing Description";
|
||||
}
|
||||
std::cout << std::endl;
|
||||
buffer += "\r\n";
|
||||
}
|
||||
}
|
||||
buffer += "\r\n";
|
||||
buffer += "Make Your Choice > ";
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
uint32_t MenuList::drawHelpPage()
|
||||
uint32_t MenuList::drawHelpPage(uint32_t drawFlags, std::string &buffer)
|
||||
{
|
||||
Menu::drawPage();
|
||||
Menu::drawHelpPage(drawFlags, buffer);
|
||||
|
||||
std::cout << "MenuList Help: Navigation Commands are:";
|
||||
std::cout << std::endl;
|
||||
|
@ -499,11 +543,18 @@ uint32_t MenuList::drawHelpPage()
|
|||
}
|
||||
|
||||
|
||||
void MenuList::reset()
|
||||
{
|
||||
Menu::reset(); // clears children too.
|
||||
|
||||
mList.clear();
|
||||
mSelectIdx = -1;
|
||||
mCursor = 0;
|
||||
}
|
||||
|
||||
uint32_t MenuList::op()
|
||||
{
|
||||
/* load friend list*/
|
||||
mList.clear();
|
||||
//rsPeers->getGpgAcceptedList(mList);
|
||||
mSelectIdx = -1;
|
||||
mCursor = 0;
|
||||
|
||||
|
@ -734,7 +785,7 @@ uint32_t MenuOpLineInput::process(char key)
|
|||
{
|
||||
/* read data in and add to buffer */
|
||||
mInput += key;
|
||||
if (key != '\n')
|
||||
if ((key != '\n') && (key != '\r'))
|
||||
{
|
||||
return MENU_PROCESS_NEEDDATA;
|
||||
}
|
||||
|
|
|
@ -7,25 +7,30 @@
|
|||
#include <map>
|
||||
#include <list>
|
||||
|
||||
#define MENU_PROCESS_NONE 0
|
||||
#define MENU_PROCESS_TOP 1
|
||||
#define MENU_PROCESS_MENU 2
|
||||
#define MENU_PROCESS_NEEDDATA 3
|
||||
#define MENU_PROCESS_DONE 4
|
||||
#define MENU_PROCESS_QUIT 5
|
||||
#define MENU_PROCESS_SHUTDOWN 6
|
||||
#define MENU_PROCESS_HELP 7
|
||||
#define MENU_PROCESS_ERROR 8
|
||||
#include "rstermserver.h" // generic processing command.
|
||||
|
||||
#define MENU_PROCESS_MASK 0x0fff
|
||||
|
||||
#define MENU_PROCESS_NONE 0x0000
|
||||
#define MENU_PROCESS_TOP 0x0001
|
||||
#define MENU_PROCESS_MENU 0x0002
|
||||
#define MENU_PROCESS_DONE 0x0004
|
||||
#define MENU_PROCESS_QUIT 0x0008
|
||||
#define MENU_PROCESS_SHUTDOWN 0x0010
|
||||
#define MENU_PROCESS_HELP 0x0020
|
||||
#define MENU_PROCESS_ERROR 0x0040
|
||||
|
||||
#define MENU_PROCESS_NEEDDATA 0x1000 // Able to be OR'd with ANOTHER CASE.
|
||||
|
||||
#define MENU_KEY_QUIT 'Q'
|
||||
#define MENU_KEY_HELP 'H'
|
||||
#define MENU_KEY_TOP 'T'
|
||||
#define MENU_KEY_REPEAT 'R'
|
||||
#define MENU_KEY_UP 'U'
|
||||
#define MENU_KEY_HELP 'h'
|
||||
#define MENU_KEY_TOP 't'
|
||||
#define MENU_KEY_REPEAT 'r'
|
||||
#define MENU_KEY_UP 'u'
|
||||
|
||||
#define MENULIST_KEY_LIST 'L' // Don't need this.
|
||||
#define MENULIST_KEY_NEXT 'N'
|
||||
#define MENULIST_KEY_PREV 'P'
|
||||
#define MENULIST_KEY_LIST 'l' // Don't need this.
|
||||
#define MENULIST_KEY_NEXT 'n'
|
||||
#define MENULIST_KEY_PREV 'p'
|
||||
|
||||
#define MENU_OP_ERROR 0
|
||||
#define MENU_OP_INSTANT 1
|
||||
|
@ -35,6 +40,11 @@
|
|||
#define MENU_ENTRY_NONE 0
|
||||
#define MENU_ENTRY_OKAY 1
|
||||
|
||||
#define MENU_DRAW_FLAGS_STD 0
|
||||
#define MENU_DRAW_FLAGS_HTML 1
|
||||
#define MENU_DRAW_FLAGS_ECHO 2
|
||||
#define MENU_DRAW_FLAGS_NOQUIT 4
|
||||
|
||||
class Menu;
|
||||
class Screen;
|
||||
|
||||
|
@ -49,19 +59,20 @@ virtual ~Menu();
|
|||
Menu *selectedMenu() { return mSelectedMenu; }
|
||||
int addMenuItem(char key, Menu *child);
|
||||
|
||||
virtual void reset();
|
||||
virtual uint32_t op() { return MENU_OP_SUBMENU; } /* what type is it? returns SUBMENU, INSTANT, NEEDINPUT */
|
||||
virtual uint32_t process(char key);
|
||||
|
||||
// THE BIT STILL TO BE DEFINED!
|
||||
|
||||
std::string ShortFnDesc() { return mShortDesc; }// Menu Text (for Help).
|
||||
virtual uint32_t drawPage(uint32_t drawFlags, std::string &buffer);
|
||||
virtual uint32_t drawHelpPage(uint32_t drawFlags, std::string &buffer);
|
||||
|
||||
//virtual std::string menuText() = 0;
|
||||
//virtual std::string menuHelp() = 0;
|
||||
virtual void setOpMessage(std::string msg) { return; }
|
||||
virtual void setErrorMessage(std::string msg) { return; }
|
||||
virtual uint32_t drawPage(); // { return 1; } //= 0;
|
||||
virtual uint32_t drawHelpPage(); // { return 1; } //= 0;
|
||||
virtual uint32_t showError() { return 1; } //= 0;
|
||||
virtual uint32_t showHelp() { return 1; } //= 0;
|
||||
|
||||
|
@ -92,6 +103,7 @@ class MenuList: public Menu
|
|||
public:
|
||||
MenuList(std::string shortDesc): Menu(shortDesc) { return; }
|
||||
|
||||
virtual void reset();
|
||||
virtual uint32_t op();
|
||||
virtual uint32_t process(char key);
|
||||
|
||||
|
@ -103,8 +115,8 @@ virtual uint32_t process(char key);
|
|||
virtual int getEntryDesc(int idx, std::string &desc);
|
||||
|
||||
// Output.
|
||||
virtual uint32_t drawPage();
|
||||
virtual uint32_t drawHelpPage();
|
||||
virtual uint32_t drawPage(uint32_t drawFlags, std::string &buffer);
|
||||
virtual uint32_t drawHelpPage(uint32_t drawFlags, std::string &buffer);
|
||||
|
||||
protected:
|
||||
virtual uint32_t list_process(char key);
|
||||
|
@ -161,17 +173,24 @@ protected:
|
|||
|
||||
|
||||
|
||||
class MenuInterface
|
||||
class MenuInterface: public RsTermServer
|
||||
{
|
||||
public:
|
||||
|
||||
MenuInterface(Menu *b) :mCurrentMenu(b), mBase(b) { return; }
|
||||
uint32_t process(char key);
|
||||
uint32_t drawHeader();
|
||||
MenuInterface(Menu *b, uint32_t drawFlags) :mCurrentMenu(b), mBase(b), mDrawFlags(drawFlags), mInputRequired(false) { return; }
|
||||
uint32_t process(char key, uint32_t drawFlags, std::string &buffer);
|
||||
uint32_t drawHeader(uint32_t drawFlags, std::string &buffer);
|
||||
|
||||
// RsTermServer Interface.
|
||||
virtual void reset();
|
||||
virtual int tick(bool haveInput, char keypress, std::string &output);
|
||||
|
||||
|
||||
private:
|
||||
Menu *mCurrentMenu;
|
||||
Menu *mBase;
|
||||
uint32_t mDrawFlags;
|
||||
bool mInputRequired;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -10,30 +10,30 @@
|
|||
// or L, N, P (list ops).
|
||||
// or 0-9,a-f (list selection).
|
||||
|
||||
#define MENU_FRIENDS_KEY_ADD 'A'
|
||||
#define MENU_FRIENDS_KEY_VIEW 'V'
|
||||
#define MENU_FRIENDS_KEY_REMOVE 'D'
|
||||
#define MENU_FRIENDS_KEY_CHAT 'C'
|
||||
#define MENU_FRIENDS_KEY_ADD 'a'
|
||||
#define MENU_FRIENDS_KEY_VIEW 'v'
|
||||
#define MENU_FRIENDS_KEY_REMOVE 'd'
|
||||
#define MENU_FRIENDS_KEY_CHAT 'c'
|
||||
|
||||
#define MENU_TRANSFER_KEY_STOP 'S'
|
||||
#define MENU_TRANSFER_KEY_CANCEL 'C'
|
||||
#define MENU_TRANSFER_KEY_STOP 's'
|
||||
#define MENU_TRANSFER_KEY_CANCEL 'c'
|
||||
|
||||
#define MENU_SEARCH_KEY_ADD 'A'
|
||||
#define MENU_SEARCH_KEY_REMOVE 'D'
|
||||
#define MENU_SEARCH_KEY_VIEW 'V'
|
||||
#define MENU_SEARCH_KEY_DOWNLOAD 'G'
|
||||
#define MENU_SEARCH_KEY_ADD 'a'
|
||||
#define MENU_SEARCH_KEY_REMOVE 'd'
|
||||
#define MENU_SEARCH_KEY_VIEW 'v'
|
||||
#define MENU_SEARCH_KEY_DOWNLOAD 'g'
|
||||
|
||||
#define MENU_FRIENDS_KEY_ADD 'A'
|
||||
#define MENU_FRIENDS_KEY_VIEW 'V'
|
||||
#define MENU_FRIENDS_KEY_REMOVE 'D'
|
||||
#define MENU_FRIENDS_KEY_CHAT 'C'
|
||||
#define MENU_FRIENDS_KEY_ADD 'a'
|
||||
#define MENU_FRIENDS_KEY_VIEW 'v'
|
||||
#define MENU_FRIENDS_KEY_REMOVE 'd'
|
||||
#define MENU_FRIENDS_KEY_CHAT 'c'
|
||||
|
||||
|
||||
#define MENU_TOPLEVEL_KEY_FRIENDS 'F'
|
||||
#define MENU_TOPLEVEL_KEY_NETWORK 'W'
|
||||
#define MENU_TOPLEVEL_KEY_TRANSFER 'D'
|
||||
#define MENU_TOPLEVEL_KEY_SEARCH 'S'
|
||||
#define MENU_TOPLEVEL_KEY_FORUMS 'O'
|
||||
#define MENU_TOPLEVEL_KEY_FRIENDS 'f'
|
||||
#define MENU_TOPLEVEL_KEY_NETWORK 'w'
|
||||
#define MENU_TOPLEVEL_KEY_TRANSFER 'd'
|
||||
#define MENU_TOPLEVEL_KEY_SEARCH 's'
|
||||
#define MENU_TOPLEVEL_KEY_FORUMS 'o'
|
||||
|
||||
|
||||
Menu *CreateMenuStructure(NotifyTxt *notify)
|
||||
|
@ -199,7 +199,7 @@ int MenuListTransfer::getEntryDesc(int idx, std::string &desc)
|
|||
return 0;
|
||||
}
|
||||
|
||||
float frac = (float) info.transfered / info.size;
|
||||
float frac = 100.0 * (float) info.transfered / info.size;
|
||||
|
||||
if (frac != 1.0)
|
||||
{
|
||||
|
@ -335,6 +335,13 @@ int MenuListSearch::removeSearch(std::string strSearchId)
|
|||
return 1;
|
||||
}
|
||||
|
||||
uint32_t MenuOpSearchNew::drawPage(uint32_t drawFlags, std::string &buffer)
|
||||
{
|
||||
buffer += "Enter New Search Term > ";
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
uint32_t MenuOpSearchNew::process_lines(std::string input)
|
||||
{
|
||||
|
|
|
@ -139,6 +139,9 @@ class MenuOpSearchNew: public MenuOpLineInput
|
|||
|
||||
MenuOpSearchNew() :MenuOpLineInput("New") { return; }
|
||||
virtual uint32_t process_lines(std::string input);
|
||||
virtual uint32_t drawPage(uint32_t drawFlags, std::string &buffer);
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -15,7 +15,9 @@ int tick()
|
|||
{
|
||||
int c = mIn.get();
|
||||
uint8_t key = (uint8_t) c;
|
||||
mMenus->process(key);
|
||||
uint32_t drawFlags = 0;
|
||||
std::string buffer;
|
||||
mMenus->process(key, drawFlags, buffer);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -28,5 +30,65 @@ private:
|
|||
std::ostream &mOut;
|
||||
};
|
||||
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "rstermserver.h"
|
||||
|
||||
class RsConsole
|
||||
{
|
||||
public:
|
||||
|
||||
RsConsole(RsTermServer *s, int infd, int outfd)
|
||||
:mServer(s), mIn(infd), mOut(outfd)
|
||||
{
|
||||
const int fcflags = fcntl(mIn,F_GETFL);
|
||||
if (fcflags < 0)
|
||||
{
|
||||
std::cerr << "RsConsole() ERROR getting fcntl FLAGS";
|
||||
std::cerr << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
if (fcntl(mIn,F_SETFL,fcflags | O_NONBLOCK) <0)
|
||||
{
|
||||
std::cerr << "RsConsole() ERROR setting fcntl FLAGS";
|
||||
std::cerr << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
int tick()
|
||||
{
|
||||
char buf;
|
||||
std::string output;
|
||||
int size = read(mIn, &buf, 1);
|
||||
|
||||
bool haveInput = (size > 0);
|
||||
|
||||
int rt = mServer->tick(haveInput, buf, output);
|
||||
|
||||
if (output.size() > 0)
|
||||
{
|
||||
write(mOut, output.c_str(), output.size());
|
||||
}
|
||||
|
||||
if (rt < 0)
|
||||
{
|
||||
std::cerr << "Exit Request";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (!haveInput)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
RsTermServer *mServer;
|
||||
int mIn, mOut;
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue