diff --git a/BPQChat.vcproj.SKIGACER.johnw.user b/BPQChat.vcproj.SKIGACER.johnw.user
new file mode 100644
index 0000000..b5b0536
--- /dev/null
+++ b/BPQChat.vcproj.SKIGACER.johnw.user
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BPQMail.c b/BPQMail.c
index 8408217..91b66ba 100644
--- a/BPQMail.c
+++ b/BPQMail.c
@@ -1127,6 +1127,8 @@
// Start adding json api (25)
// Fix reading nested directories when loading Standard Templates and other template bugs (25)
// Add TO and AT to "Message has nowhere to go" message (28)
+// Add My Sent and My Received filter options to Webmail (30)
+// Add Send P to multiple BBS's when routing on HR (30)
#include "bpqmail.h"
#include "winstdint.h"
diff --git a/Bpq32.c b/Bpq32.c
index 576f6be..d826062 100644
--- a/Bpq32.c
+++ b/Bpq32.c
@@ -1208,7 +1208,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Disable CTS check in WriteComBlock (26)
// Improvments to reporting to M0LTE Map (26)
// IPGateway fix from github user isavitsky (27)
-// Fix possible crash in SCSPactor PTCPORT code (29)
+// Fix possible crash in SCSPactor PTCPORT code (29)
#define CKernel
diff --git a/CBPQ32.vcproj.NOTTSDESKTOP.John.user b/CBPQ32.vcproj.NOTTSDESKTOP.John.user
index f4ba73a..270b67b 100644
--- a/CBPQ32.vcproj.NOTTSDESKTOP.John.user
+++ b/CBPQ32.vcproj.NOTTSDESKTOP.John.user
@@ -37,7 +37,7 @@
Name="Release|Win32"
>
BBSNext)
{
@@ -1467,7 +1468,49 @@ NOHA:
}
// We should choose the BBS with most matching elements (ie match on #23.GBR better that GBR)
- // If SendPtoMultiple is set I think we send to any with same mtch level
+ // If SendPtoMultiple is set I think we send to any with same match level
+
+ // So if SendPtoMultiple is set I think I need to find the best depth then send to all with the same depth
+
+
+ if (SendPtoMultiple && Msg->type == 'P')
+ {
+ Logprintf(LOG_BBS, conn, '?', "SendPtoMultiple is set. Checking for best match level");
+
+ for (bbs = BBSChain; bbs; bbs = bbs->BBSNext)
+ {
+ ForwardingInfo = bbs->ForwardingInfo;
+
+ depth = CheckBBSHElements(Msg, bbs, ForwardingInfo, ATBBS, &HElements[0]);
+
+ if (depth)
+ {
+ if (depth > MultiPDepth)
+ {
+ MultiPDepth = depth;
+ bestbbs = bbs;
+ }
+ }
+
+ if (MultiPDepth)
+ {
+ for (bbs = BBSChain; bbs; bbs = bbs->BBSNext)
+ {
+ ForwardingInfo = bbs->ForwardingInfo;
+
+ depth = CheckBBSHElements(Msg, bbs, ForwardingInfo, ATBBS, &HElements[0]);
+
+ if (depth == MultiPDepth)
+ {
+ Logprintf(LOG_BBS, conn, '?', "Routing Trace HR Matches BBS %s Depth %d", bbs->Call, depth);
+ CheckAndSend(Msg, conn, bbs);
+ }
+ }
+
+ return 1;
+ }
+ }
+ }
for (bbs = BBSChain; bbs; bbs = bbs->BBSNext)
{
@@ -1481,7 +1524,7 @@ NOHA:
if (depth)
{
Logprintf(LOG_BBS, conn, '?', "Routing Trace HR Matches BBS %s Depth %d", bbs->Call, depth);
-
+
if (depth > bestmatch)
{
bestmatch = depth;
@@ -1494,14 +1537,14 @@ NOHA:
Logprintf(LOG_BBS, conn, '?', "Routing Trace HR Best Match is %s", bestbbs->Call);
CheckAndSend(Msg, conn, bestbbs);
-
+
return 1;
}
// Check for wildcarded AT address
-// if (ATBBS[0] == 0)
-// return FALSE; // no AT
+ // if (ATBBS[0] == 0)
+ // return FALSE; // no AT
CheckWildCardedAT:
@@ -1521,7 +1564,7 @@ CheckWildCardedAT:
if (depth > -1)
{
Logprintf(LOG_BBS, conn, '?', "Routing Trace Wildcarded AT Matches %s Length %d", bbs->Call, depth);
-
+
if (depth > bestmatch)
{
bestmatch = depth;
@@ -1543,182 +1586,182 @@ CheckWildCardedAT:
Logprintf(LOG_BBS, conn, '?', "Routing Trace - No Match");
return FALSE; // No match
- }
+ }
- // Flood Bulls go to all matching BBSs in the flood area, so the order of checking doesn't matter
+ // Flood Bulls go to all matching BBSs in the flood area, so the order of checking doesn't matter
- // For now I will only route on AT (for non-hierarchical addresses) and HA
+ // For now I will only route on AT (for non-hierarchical addresses) and HA
- // Ver 1.0.4.2 - Try including TO
+ // Ver 1.0.4.2 - Try including TO
- for (bbs = BBSChain; bbs; bbs = bbs->BBSNext)
- {
- ForwardingInfo = bbs->ForwardingInfo;
+ for (bbs = BBSChain; bbs; bbs = bbs->BBSNext)
+ {
+ ForwardingInfo = bbs->ForwardingInfo;
- if (ForwardingInfo->PersonalOnly)
- continue;
+ if (ForwardingInfo->PersonalOnly)
+ continue;
- if (CheckBBSToList(Msg, bbs, ForwardingInfo))
- {
- Logprintf(LOG_BBS, conn, '?', "Routing Trace TO %s Matches BBS %s", Msg->to, bbs->Call);
-
- if (ForwardToMe || _stricmp(bbs->Call, BBSName) != 0) // Dont forward to ourself - already here! (unless ForwardToMe set)
+ if (CheckBBSToList(Msg, bbs, ForwardingInfo))
{
- set_fwd_bit(Msg->fbbs, bbs->BBSNumber);
- ForwardingInfo->MsgCount++;
+ Logprintf(LOG_BBS, conn, '?', "Routing Trace TO %s Matches BBS %s", Msg->to, bbs->Call);
+
+ if (ForwardToMe || _stricmp(bbs->Call, BBSName) != 0) // Dont forward to ourself - already here! (unless ForwardToMe set)
+ {
+ set_fwd_bit(Msg->fbbs, bbs->BBSNumber);
+ ForwardingInfo->MsgCount++;
+ }
+ Count++;
+ continue;
}
- Count++;
- continue;
+
+ if ((strcmp(ATBBS, bbs->Call) == 0) || // @BBS = BBS
+ CheckBBSAtList(Msg, ForwardingInfo, ATBBS))
+ {
+ Logprintf(LOG_BBS, conn, '?', "Routing Trace AT %s Matches BBS %s", Msg->to, bbs->Call);
+ CheckAndSend(Msg, conn, bbs);
+
+ Count++;
+ continue;
+ }
+
+
+ if (CheckBBSHElementsFlood(Msg, bbs, ForwardingInfo, Msg->via, &HElements[0]))
+ {
+ Logprintf(LOG_BBS, conn, '?', "Routing Trace HR %s %s %s %s %s Matches BBS %s",
+ HElements[0], HElements[1], HElements[2],
+ HElements[3], HElements[4], bbs->Call);
+
+ CheckAndSend(Msg, conn, bbs);
+
+ Count++;
+ }
+
}
- if ((strcmp(ATBBS, bbs->Call) == 0) || // @BBS = BBS
- CheckBBSAtList(Msg, ForwardingInfo, ATBBS))
- {
- Logprintf(LOG_BBS, conn, '?', "Routing Trace AT %s Matches BBS %s", Msg->to, bbs->Call);
- CheckAndSend(Msg, conn, bbs);
-
- Count++;
- continue;
- }
-
-
- if (CheckBBSHElementsFlood(Msg, bbs, ForwardingInfo, Msg->via, &HElements[0]))
- {
- Logprintf(LOG_BBS, conn, '?', "Routing Trace HR %s %s %s %s %s Matches BBS %s",
- HElements[0], HElements[1], HElements[2],
- HElements[3], HElements[4], bbs->Call);
-
- CheckAndSend(Msg, conn, bbs);
-
- Count++;
- }
-
- }
-
- if (Count == 0)
- goto CheckWildCardedAT;
+ if (Count == 0)
+ goto CheckWildCardedAT;
Logprintf(LOG_BBS, conn, '?', "Routing Trace - No Match");
- return Count;
-}
-
-BOOL CheckBBSToList(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSForwardingInfo * ForwardingInfo)
-{
- char ** Calls;
-
- // Check TO distributions
-
- if (ForwardingInfo->TOCalls)
- {
- Calls = ForwardingInfo->TOCalls;
-
- while(Calls[0])
- {
- if (strcmp(Calls[0], Msg->to) == 0)
- return TRUE;
-
- Calls++;
- }
+ return Count;
}
- return FALSE;
-}
-BOOL CheckBBSAtList(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS)
-{
- char ** Calls;
-
- // Check AT distributions
-
-// if (strcmp(ATBBS, bbs->Call) == 0) // @BBS = BBS
-// return TRUE;
-
- if (ForwardingInfo->ATCalls)
+ BOOL CheckBBSToList(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSForwardingInfo * ForwardingInfo)
{
- Calls = ForwardingInfo->ATCalls;
+ char ** Calls;
- while(Calls[0])
+ // Check TO distributions
+
+ if (ForwardingInfo->TOCalls)
{
- if (strcmp(Calls[0], ATBBS) == 0)
- return TRUE;
+ Calls = ForwardingInfo->TOCalls;
- Calls++;
- }
- }
- return FALSE;
-}
-
-int CheckBBSHElements(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS, char ** HElements)
-{
- // Used for Personal Messages, and Bulls not yot at their target area
-
- char *** HRoutes;
- int i = 0, j, k = 0;
- int bestmatch = 0;
-
- if (ForwardingInfo->HADDRSP)
- {
- // Match on Routes
-
- HRoutes = ForwardingInfo->HADDRSP;
- k=0;
-
- while(HRoutes[k])
- {
- i = j = 0;
-
- while (HRoutes[k][i] && HElements[j]) // Until one set runs out
+ while(Calls[0])
{
- if (strcmp(HRoutes[k][i], HElements[j]) != 0)
+ if (strcmp(Calls[0], Msg->to) == 0)
+ return TRUE;
+
+ Calls++;
+ }
+ }
+ return FALSE;
+ }
+
+ BOOL CheckBBSAtList(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS)
+ {
+ char ** Calls;
+
+ // Check AT distributions
+
+ // if (strcmp(ATBBS, bbs->Call) == 0) // @BBS = BBS
+ // return TRUE;
+
+ if (ForwardingInfo->ATCalls)
+ {
+ Calls = ForwardingInfo->ATCalls;
+
+ while(Calls[0])
+ {
+ if (strcmp(Calls[0], ATBBS) == 0)
+ return TRUE;
+
+ Calls++;
+ }
+ }
+ return FALSE;
+ }
+
+ int CheckBBSHElements(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS, char ** HElements)
+ {
+ // Used for Personal Messages, and Bulls not yot at their target area
+
+ char *** HRoutes;
+ int i = 0, j, k = 0;
+ int bestmatch = 0;
+
+ if (ForwardingInfo->HADDRSP)
+ {
+ // Match on Routes
+
+ HRoutes = ForwardingInfo->HADDRSP;
+ k=0;
+
+ while(HRoutes[k])
+ {
+ i = j = 0;
+
+ while (HRoutes[k][i] && HElements[j]) // Until one set runs out
+ {
+ if (strcmp(HRoutes[k][i], HElements[j]) != 0)
+ break;
+ i++;
+ j++;
+ }
+
+ // Only send if all BBS elements match
+
+ if (HRoutes[k][i] == 0)
+ {
+ if (i > bestmatch)
+ bestmatch = i;
+ }
+ k++;
+ }
+ }
+ return bestmatch;
+ }
+
+
+ int CheckBBSHElementsFlood(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS, char ** HElements)
+ {
+ char *** HRoutes;
+ char ** BBSHA;
+
+ int i = 0, j, k = 0;
+ int bestmatch = 0;
+
+ if (ForwardingInfo->HADDRS)
+ {
+ // Match on Routes
+
+ // Message must be in right area (all elements of message match BBS Location HA)
+
+ BBSHA = ForwardingInfo->BBSHAElements;
+
+ if (BBSHA == NULL)
+ return 0; // Not safe to flood
+
+ i = j = 0;
+
+ while (BBSHA[i] && HElements[j]) // Until one set runs out
+ {
+ if (strcmp(BBSHA[i], HElements[j]) != 0)
break;
i++;
j++;
}
- // Only send if all BBS elements match
-
- if (HRoutes[k][i] == 0)
- {
- if (i > bestmatch)
- bestmatch = i;
- }
- k++;
- }
- }
- return bestmatch;
-}
-
-
-int CheckBBSHElementsFlood(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS, char ** HElements)
-{
- char *** HRoutes;
- char ** BBSHA;
-
- int i = 0, j, k = 0;
- int bestmatch = 0;
-
- if (ForwardingInfo->HADDRS)
- {
- // Match on Routes
-
- // Message must be in right area (all elements of message match BBS Location HA)
-
- BBSHA = ForwardingInfo->BBSHAElements;
-
- if (BBSHA == NULL)
- return 0; // Not safe to flood
-
- i = j = 0;
-
- while (BBSHA[i] && HElements[j]) // Until one set runs out
- {
- if (strcmp(BBSHA[i], HElements[j]) != 0)
- break;
- i++;
- j++;
- }
-
- if (HElements[j] != 0)
+ if (HElements[j] != 0)
return 0; // Message is not for BBS's area
HRoutes = ForwardingInfo->HADDRS;
diff --git a/Versions.h b/Versions.h
index e3200b9..0c9ebab 100644
--- a/Versions.h
+++ b/Versions.h
@@ -10,8 +10,8 @@
#endif
-#define KVers 6,0,24,29
-#define KVerstring "6.0.24.29\0"
+#define KVers 6,0,24,30
+#define KVerstring "6.0.24.30\0"
#ifdef CKernel
diff --git a/WebMail.c b/WebMail.c
index 157938b..f493c06 100644
--- a/WebMail.c
+++ b/WebMail.c
@@ -928,6 +928,22 @@ int SendWebMailHeaderEx(char * Reply, char * Key, struct HTTPConnectionInfo * Se
continue;
}
+ if (Session->WebMailMyTX)
+ {
+ // Only list if to or from me
+
+ if (strcmp(User->Call, Msg->from) != 0)
+ continue;
+ }
+
+ if (Session->WebMailMyRX)
+ {
+ // Only list if to or from me
+
+ if (strcmp(User->Call, Msg->to)!= 0)
+ continue;
+ }
+
if (Count++ < Session->WebMailSkip)
continue;
@@ -959,7 +975,7 @@ int SendWebMailHeaderEx(char * Reply, char * Key, struct HTTPConnectionInfo * Se
if (WebMailTemplate == NULL)
WebMailTemplate = GetTemplateFromFile(6, "WebMailPage.txt");
- return sprintf(Reply, WebMailTemplate, BBSName, User->Call, Key, Key, Key, Key, Key, Key, Key, Key, Messages);
+ return sprintf(Reply, WebMailTemplate, BBSName, User->Call, Key, Key, Key, Key, Key, Key, Key, Key, Key, Key, Messages);
}
int ViewWebMailMessage(struct HTTPConnectionInfo * Session, char * Reply, int Number, BOOL DisplayHTML)
@@ -1617,6 +1633,8 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
Session->WebMailLastUsed = time(NULL);
Session->WebMailSkip = 0;
+ Session->WebMailMyTX = FALSE;
+ Session->WebMailMyRX = FALSE;
Session->WebMailMine = FALSE;
if (WebMailTemplate)
@@ -1759,6 +1777,8 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
Session->WebMailSkip = 0;
Session->WebMailMine = FALSE;
+ Session->WebMailMyTX = FALSE;
+ Session->WebMailMyRX = FALSE;
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
return;
@@ -1769,6 +1789,8 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
Session->WebMailSkip = 0;
Session->WebMailTypes[0] = 0;
Session->WebMailMine = FALSE;
+ Session->WebMailMyTX = FALSE;
+ Session->WebMailMyRX = FALSE;
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
return;
@@ -1779,6 +1801,8 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
Session->WebMailSkip = 0;
strcpy(Session->WebMailTypes, "B");
Session->WebMailMine = FALSE;
+ Session->WebMailMyTX = FALSE;
+ Session->WebMailMyRX = FALSE;
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
return;
@@ -1789,6 +1813,8 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
Session->WebMailSkip = 0;
strcpy(Session->WebMailTypes, "P");
Session->WebMailMine = FALSE;
+ Session->WebMailMyTX = FALSE;
+ Session->WebMailMyRX = FALSE;
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
return;
@@ -1799,6 +1825,8 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
Session->WebMailSkip = 0;
strcpy(Session->WebMailTypes, "T");
Session->WebMailMine = FALSE;
+ Session->WebMailMyTX = FALSE;
+ Session->WebMailMyRX = FALSE;
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
return;
@@ -1809,6 +1837,32 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
Session->WebMailSkip = 0;
Session->WebMailTypes[0] = 0;
Session->WebMailMine = TRUE;
+ Session->WebMailMyTX = FALSE;
+ Session->WebMailMyRX = FALSE;
+
+ *RLen = SendWebMailHeader(Reply, Session->Key, Session);
+ return;
+ }
+
+ if (_stricmp(NodeURL, "/WebMail/WMtoMe") == 0)
+ {
+ Session->WebMailSkip = 0;
+ Session->WebMailTypes[0] = 0;
+ Session->WebMailMine = FALSE;
+ Session->WebMailMyTX = FALSE;
+ Session->WebMailMyRX = TRUE;
+
+ *RLen = SendWebMailHeader(Reply, Session->Key, Session);
+ return;
+ }
+
+ if (_stricmp(NodeURL, "/WebMail/WMfromMe") == 0)
+ {
+ Session->WebMailSkip = 0;
+ Session->WebMailTypes[0] = 0;
+ Session->WebMailMine = TRUE;
+ Session->WebMailMyTX = TRUE;
+ Session->WebMailMyRX = FALSE;
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
return;
@@ -1897,6 +1951,8 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
"NTS | \r\n"
"All Types | \r\n"
"Mine | \r\n"
+ "My Sent | \r\n"
+ "My Rxed | \r\n"
"Auto Refresh | \r\n"
"Send Message | \r\n"
"Logout | \r\n"
@@ -1906,7 +1962,7 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
"Waiting for data...
\r\n"
"