Skip to content

Commit 8b7c927

Browse files
committed
Linux-Fan <Ma_Sys.ma@web.de> - implement -m option.
e commit message for your changes. Lines starting
1 parent 0855041 commit 8b7c927

File tree

5 files changed

+119
-1
lines changed

5 files changed

+119
-1
lines changed

cone/cone/cone.C

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@ void openHierarchyScreen(std::string prompt,
429429
myServer **selectedServer)
430430
{
431431
CursesHierarchy hierarchy_screen( &myServer::hierarchy, mainScreen);
432+
myServer::setCursesHierarchyPointerForRefreshing(&hierarchy_screen);
432433

433434
titleBar->setTitles(_("FOLDERS"), "");
434435

@@ -474,6 +475,8 @@ void openHierarchyScreen(std::string prompt,
474475
*selectedFolder=hierarchy_screen.folderSelected;
475476
if (selectedServer)
476477
*selectedServer=hierarchy_screen.serverSelected;
478+
479+
myServer::setCursesHierarchyPointerForRefreshing(NULL);
477480
}
478481

479482
void hierarchyScreen(void *dummy)
@@ -1025,6 +1028,8 @@ static void cleanup()
10251028
delete myServer::remoteConfigAccount;
10261029
myServer::remoteConfigAccount=NULL;
10271030
}
1031+
1032+
myServer::closePollForRefreshMessageCount();
10281033
}
10291034

10301035
//
@@ -1142,7 +1147,7 @@ int main(int argc, char *argv[])
11421147
int recover=0;
11431148
Macros macroBuffer;
11441149

1145-
while ((optc=getopt(argc, argv, "vrCc:")) != -1)
1150+
while ((optc=getopt(argc, argv, "vrCc:m:")) != -1)
11461151
{
11471152
switch (optc) {
11481153
case 'v':
@@ -1151,6 +1156,16 @@ int main(int argc, char *argv[])
11511156
case 'r':
11521157
recover=1;
11531158
break;
1159+
case 'm':
1160+
// try to delete if existent, ignore fail
1161+
unlink(optarg);
1162+
if(mkfifo(optarg, 0644) < 0)
1163+
{
1164+
perror("Failed to create FIFO");
1165+
exit(1);
1166+
}
1167+
myServer::setPollForRefreshMessageCount(optarg);
1168+
break;
11541169
case 'c':
11551170

11561171
myServer::configDir=optarg;

cone/cone/curseshierarchy.C

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -985,6 +985,26 @@ void CursesHierarchyDeleteFolderVerifyCallback
985985
me->processDeletedFolder(parent, deleted, updatedFolder);
986986
}
987987

988+
bool CursesHierarchy::RefreshIterator::visit(Hierarchy::Folder* f)
989+
{
990+
if(f != NULL && this->cs != NULL)
991+
f->updateInfo(this->cs, true);
992+
return true;
993+
}
994+
995+
bool CursesHierarchy::RefreshIterator::visit(Hierarchy::Server* s)
996+
{
997+
if(s != NULL)
998+
this->cs = s->getServer();
999+
return true;
1000+
}
1001+
1002+
void CursesHierarchy::refreshAllFolders()
1003+
{
1004+
RefreshIterator iterator;
1005+
getHierarchy()->root.prefixIterate(iterator);
1006+
}
1007+
9881008
///////////
9891009
bool CursesHierarchy::processKey(const Curses::Key &key)
9901010
{

cone/cone/curseshierarchy.H

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ class CursesHierarchy : public Curses, public HierarchyDisplay,
6161

6262
};
6363

64+
class RefreshIterator: public Hierarchy::EntryIterator {
65+
private:
66+
myServer* cs = NULL;
67+
public:
68+
bool visit(Hierarchy::Folder* f);
69+
bool visit(Hierarchy::Server* s);
70+
};
71+
6472
public:
6573
friend class DrawIterator;
6674

@@ -84,6 +92,7 @@ public:
8492
bool drawErase(Hierarchy::Server *server, bool doErase);
8593
void visible(Hierarchy::Entry *e);
8694

95+
void refreshAllFolders();
8796

8897
private:
8998
bool drawErase(std::string str1, int col1,

cone/cone/myserver.C

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <fcntl.h>
2424
#include <pwd.h>
2525
#include <unistd.h>
26+
#include <poll.h>
2627

2728
#include <iostream>
2829

@@ -42,6 +43,10 @@ Certificates *myServer::certs;
4243
extern void folderIndexScreen(void *);
4344
extern void hierarchyScreen(void *);
4445

46+
int myServer::pollFDForRefreshMessageCount = -1;
47+
int myServer::pollFDForRefreshMessageCountWriteDirection = -1;
48+
CursesHierarchy* myServer::cursesHierarchyForRefreshing = NULL;
49+
4550
myServer::myServer(string name, string urlArg)
4651
: serverName(name), url(urlArg), mailCheckInterval(300), server(NULL),
4752
currentFolder(NULL), hierarchyEntry(NULL)
@@ -273,6 +278,16 @@ bool myServer::eventloop(myServer::Callback *callback)
273278
if (alarmCalled)
274279
continue; // Something might've happened...
275280

281+
// poll() ignores file descriptors less than 0, thus the
282+
// `pollFDForRefresh` can always be added regardless of the
283+
// feature being used or not.
284+
struct pollfd pollFDForRefresh = {
285+
myServer::pollFDForRefreshMessageCount,
286+
POLLIN,
287+
0
288+
};
289+
fds.push_back(pollFDForRefresh);
290+
276291
if (mail::account::poll(fds, ioTimeout) < 0)
277292
{
278293
if (errno != EINTR)
@@ -281,6 +296,17 @@ bool myServer::eventloop(myServer::Callback *callback)
281296
break;
282297
}
283298
}
299+
300+
char buf[128];
301+
int pollev = fds.back().revents;
302+
fds.pop_back();
303+
if((pollev & POLLIN) && read(
304+
myServer::pollFDForRefreshMessageCount,
305+
buf, sizeof(buf)) > 0 &&
306+
myServer::pollFDForRefreshMessageCount != -1 &&
307+
myServer::cursesHierarchyForRefreshing != NULL)
308+
myServer::cursesHierarchyForRefreshing->
309+
refreshAllFolders();
284310
}
285311

286312
statusBar->notbusy();
@@ -1032,3 +1058,39 @@ void myServer::checkNewMail()
10321058

10331059
finishCheckingNewMail();
10341060
}
1061+
1062+
void myServer::setPollForRefreshMessageCount(string fn)
1063+
{
1064+
if((myServer::pollFDForRefreshMessageCount =
1065+
open(fn.c_str(), O_RDONLY | O_CLOEXEC | O_NONBLOCK)) < 0)
1066+
{
1067+
perror("Failed to open FIFO for reading");
1068+
exit(1);
1069+
}
1070+
// Open another file descriptor for writing such that the pipe is
1071+
// kept open regardless of any external application closing it.
1072+
if((myServer::pollFDForRefreshMessageCountWriteDirection =
1073+
open(fn.c_str(), O_WRONLY | O_CLOEXEC)) < 0)
1074+
{
1075+
perror("Failed to open FIFO for writing");
1076+
exit(1);
1077+
}
1078+
}
1079+
1080+
void myServer::closePollForRefreshMessageCount()
1081+
{
1082+
if(myServer::pollFDForRefreshMessageCount != -1)
1083+
{
1084+
// POSIX logic: close returns 0 on success thus true on fail...
1085+
if(close(myServer::pollFDForRefreshMessageCount))
1086+
perror("Failed to close message count update file "
1087+
"descriptor");
1088+
close(myServer::pollFDForRefreshMessageCountWriteDirection);
1089+
myServer::pollFDForRefreshMessageCount = -1;
1090+
}
1091+
}
1092+
1093+
void myServer::setCursesHierarchyPointerForRefreshing(CursesHierarchy* h)
1094+
{
1095+
myServer::cursesHierarchyForRefreshing = h;
1096+
}

cone/cone/myserver.H

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "curses/timer.H"
1515
#include "myreadfolders.H"
1616
#include "certificates.H"
17+
#include "curseshierarchy.H"
1718

1819
#include <string>
1920
#include <vector>
@@ -86,6 +87,13 @@ private:
8687
std::map<std::string, std::map<std::string, std::string>
8788
> folder_configuration;
8889

90+
// Allow refreshing message counts through messages on a named pipe.
91+
// Necessary file descriptor for reading, the other direction to keep
92+
// the pipe open and GUI pointer.
93+
static int pollFDForRefreshMessageCount;
94+
static int pollFDForRefreshMessageCountWriteDirection;
95+
static CursesHierarchy* cursesHierarchyForRefreshing;
96+
8997
public:
9098
bool updateServerConfiguration(std::string name, std::string value);
9199
std::string getServerConfiguration(std::string name);
@@ -220,6 +228,10 @@ public:
220228
void addHierarchy(bool assignRows);
221229
void showHierarchy();
222230
void updateHierarchy();
231+
232+
static void setPollForRefreshMessageCount(std::string fn);
233+
static void closePollForRefreshMessageCount();
234+
static void setCursesHierarchyPointerForRefreshing(CursesHierarchy* h);
223235
private:
224236
void addTopLevelFolders();
225237
void addTopLevelFolder(std::string);

0 commit comments

Comments
 (0)