From d1b1fc1b7ee8039aa698f307454dd1bcfdadd3f4 Mon Sep 17 00:00:00 2001 From: Robin Davies Date: Tue, 26 Apr 2022 04:47:57 -0400 Subject: [PATCH] List of addresses in the About dialog --- react/src/AboutDialog.tsx | 104 ++++++++++++++++++++++--------------- react/src/AppThemed.tsx | 18 +++++-- react/src/PiPedalModel.tsx | 1 + src/Ipv6Helpers.cpp | 47 ++++++++++------- src/Ipv6Helpers.hpp | 3 ++ src/PiPedalModel.hpp | 2 +- src/PiPedalSocket.cpp | 2 +- src/PiPedalVersion.cpp | 43 ++++++++++++++- src/PiPedalVersion.hpp | 5 +- 9 files changed, 156 insertions(+), 69 deletions(-) diff --git a/react/src/AboutDialog.tsx b/react/src/AboutDialog.tsx index 10d98ec..b3531a3 100644 --- a/react/src/AboutDialog.tsx +++ b/react/src/AboutDialog.tsx @@ -5,15 +5,16 @@ import Typography from '@mui/material/Typography'; import { PiPedalModel, PiPedalModelFactory, State } from './PiPedalModel'; import AppBar from '@mui/material/AppBar'; import Toolbar from '@mui/material/Toolbar'; +import Divider from '@mui/material/Divider'; import ArrowBackIcon from '@mui/icons-material//ArrowBack'; import JackHostStatus from './JackHostStatus'; -import {PiPedalError} from './PiPedalError'; +import { PiPedalError } from './PiPedalError'; import DialogEx from './DialogEx'; import { Theme, createStyles } from '@mui/material/styles'; -import { withStyles, WithStyles} from '@mui/styles'; -import Slide, {SlideProps} from '@mui/material/Slide'; +import { withStyles, WithStyles } from '@mui/styles'; +import Slide, { SlideProps } from '@mui/material/Slide'; interface AboutDialogProps extends WithStyles { @@ -115,7 +116,7 @@ const AboutDialog = withStyles(styles, { withTheme: true })( if (this.model.state.get() === State.Ready) { this.model.getJackStatus() .then(jackStatus => { - this.setState({jackStatus: jackStatus}); + this.setState({ jackStatus: jackStatus }); }) .catch(error => { /* ignore*/ }); } @@ -138,30 +139,25 @@ const AboutDialog = withStyles(styles, { withTheme: true })( } } - startFossRequest() - { - if (this.state.openSourceNotices === "") - { + startFossRequest() { + if (this.state.openSourceNotices === "") { fetch("var/notices.txt") - .then((request)=> - { - if (!request.ok) - { - throw new PiPedalError("notices request failed."); - } - return request.text(); - }) - .then((text) => { - if (this.mounted) - { - this.setState({ openSourceNotices: text}); - } - - }) - .catch((err) => { - // ok in debug builds. File doesn't get placed until install time. - console.log("Failed to fetch open-source notices. " + err); - }); + .then((request) => { + if (!request.ok) { + throw new PiPedalError("notices request failed."); + } + return request.text(); + }) + .then((text) => { + if (this.mounted) { + this.setState({ openSourceNotices: text }); + } + + }) + .catch((err) => { + // ok in debug builds. File doesn't get placed until install time. + console.log("Failed to fetch open-source notices. " + err); + }); } } @@ -189,8 +185,8 @@ const AboutDialog = withStyles(styles, { withTheme: true })( return ( { this.props.onClose() }} TransitionComponent={Transition} - style={{userSelect: "none"}} - > + style={{ userSelect: "none" }} + >
@@ -208,28 +204,52 @@ const AboutDialog = withStyles(styles, { withTheme: true })(
-
+
- PiPedal - {(this.model.serverVersion? this.model.serverVersion.serverVersion : "") - + (this.model.serverVersion?.debug ? " (Debug)": "")} - + PiPedal + {(this.model.serverVersion ? this.model.serverVersion.serverVersion : "") + + (this.model.serverVersion?.debug ? " (Debug)" : "")} + - - Copyright © 2022 Robin Davies. - - - {this.model.getAndroidHostVersion() } + + Copyright © 2022 Robin Davies. + {this.model.isAndroidHosted() && ( + + {this.model.getAndroidHostVersion()} + + )} - + {this.model.isAndroidHosted() && ( + + Copyright © 2022 Robin Davies. + + )} + + + ADDRESSES + +
+ { + this.model.serverVersion?.webAddresses.map((address) => + ( + + {address} + + )) + + } +
+ + + LEGAL NOTICES -
+
diff --git a/react/src/AppThemed.tsx b/react/src/AppThemed.tsx index d12e121..ff8db5c 100644 --- a/react/src/AppThemed.tsx +++ b/react/src/AppThemed.tsx @@ -537,7 +537,7 @@ const AppThemed = withStyles(appStyles)(class extends ResizeResponsiveComponent< setDisplayState(newState: State): void { this.updateOverscroll(); - this.setState({ + this.setState({ displayState: newState, canFullScreen: supportsFullScreen() && !this.model_.isAndroidHosted() }); @@ -576,6 +576,13 @@ const AppThemed = withStyles(appStyles)(class extends ResizeResponsiveComponent< } return result; } + handleReload() { + if (this.model_.isAndroidHosted()) { + this.model_.chooseNewDevice(); + } else { + window.location.reload(); + } + } render() { const { classes } = this.props; @@ -785,9 +792,10 @@ const AppThemed = withStyles(appStyles)(class extends ResizeResponsiveComponent< -
@@ -796,7 +804,7 @@ const AppThemed = withStyles(appStyles)(class extends ResizeResponsiveComponent<
- { this.state.displayState === State.ApplyingChanges ? "Applying\u00A0changes..." : "Reconnecting..."} + {this.state.displayState === State.ApplyingChanges ? "Applying\u00A0changes..." : "Reconnecting..."}
@@ -816,7 +824,7 @@ const AppThemed = withStyles(appStyles)(class extends ResizeResponsiveComponent<
diff --git a/react/src/PiPedalModel.tsx b/react/src/PiPedalModel.tsx index 42d8fb3..d1041c2 100644 --- a/react/src/PiPedalModel.tsx +++ b/react/src/PiPedalModel.tsx @@ -159,6 +159,7 @@ export type PiPedalVersion = { operatingSystem: string; osVersion: string; debug: boolean; + webAddresses: string[]; }; export class PresetIndexEntry { diff --git a/src/Ipv6Helpers.cpp b/src/Ipv6Helpers.cpp index f1709b4..a758a3a 100644 --- a/src/Ipv6Helpers.cpp +++ b/src/Ipv6Helpers.cpp @@ -86,10 +86,10 @@ static bool IsIpv4OnLocalSubnet(uint32_t ipv4Addres) } bool pipedal::ParseHttpAddress(const std::string address, - std::string *pUser, - std::string *pServer, - int *pPort, - int defaultPort) + std::string *pUser, + std::string *pServer, + int *pPort, + int defaultPort) { // strip user. auto start = address.find_first_of('@'); @@ -97,10 +97,12 @@ bool pipedal::ParseHttpAddress(const std::string address, { if (pUser) { - *pUser = address.substr(0,start); + *pUser = address.substr(0, start); } - start = start+1; - } else { + start = start + 1; + } + else + { start = 0; if (pUser) { @@ -109,9 +111,9 @@ bool pipedal::ParseHttpAddress(const std::string address, } // find the port address. int port = address.length(); - while (port > 0 && address[port-1] != ':') + while (port > 0 && address[port - 1] != ':') { - if (address[port-1] != ']') + if (address[port - 1] != ']') { port = address.length(); break; @@ -121,7 +123,7 @@ bool pipedal::ParseHttpAddress(const std::string address, int portNumber = defaultPort; if (port < address.length() && address[port] == ':') { - const char*p = address.c_str()+port+1; + const char *p = address.c_str() + port + 1; if (*p) { portNumber = 0; @@ -129,8 +131,10 @@ bool pipedal::ParseHttpAddress(const std::string address, { if (*p >= '0' && *p <= '9') { - portNumber = portNumber*10 + *p -'0'; - } else { + portNumber = portNumber * 10 + *p - '0'; + } + else + { return false; } } @@ -142,7 +146,7 @@ bool pipedal::ParseHttpAddress(const std::string address, } if (pServer) { - *pServer = address.substr(start,port-start); + *pServer = address.substr(start, port - start); } return true; } @@ -349,12 +353,12 @@ static std::string GetLinkLocalAddressForInterface(const std::string &name) freeifaddrs(ifap); return result; } -static std::string GetLinkLocalAddressForIp4Interface(const std::string&name) +static std::string GetLinkLocalAddressForIp4Interface(const std::string &name) { struct ifaddrs *ifap = nullptr; if (getifaddrs(&ifap) != 0) return ""; - std::string result = "notlocalsubnet.error"; + std::string result = ""; for (ifaddrs *p = ifap; p != nullptr; p = p->ifa_next) { if (p->ifa_addr->sa_family == AF_INET && p->ifa_addr != nullptr && p->ifa_netmask != nullptr) @@ -423,11 +427,13 @@ std::string pipedal::GetLinkLocalAddress(const std::string fromAddress) // others? if (IN6_IS_ADDR_V4MAPPED(&inetAddr6)) { - int8_t*pAddr = (int8_t*)&inetAddr6; - uint32_t remoteAddress = htonl(*(int32_t*)(pAddr+12)); + int8_t *pAddr = (int8_t *)&inetAddr6; + uint32_t remoteAddress = htonl(*(int32_t *)(pAddr + 12)); std::string interfaceName = GetInterfaceForIp4Address(remoteAddress); result = GetLinkLocalAddressForIp4Interface(interfaceName); - } else { + } + else + { std::string interfaceName; if (IsIpv4MappedAddress(inetAddr6)) @@ -449,3 +455,8 @@ std::string pipedal::GetLinkLocalAddress(const std::string fromAddress) } return result; } + +std::string pipedal::GetInterfaceIpv4Address(const std::string& interfaceName) +{ + return GetLinkLocalAddressForIp4Interface(interfaceName); +} diff --git a/src/Ipv6Helpers.hpp b/src/Ipv6Helpers.hpp index 7acccb8..68c788d 100644 --- a/src/Ipv6Helpers.hpp +++ b/src/Ipv6Helpers.hpp @@ -24,6 +24,9 @@ namespace pipedal { + std::string GetInterfaceIpv4Address(const std::string& interfaceName); + + std::string GetLinkLocalAddress(const std::string fromAddress); bool IsOnLocalSubnet(const std::string&fromAddress); diff --git a/src/PiPedalModel.hpp b/src/PiPedalModel.hpp index ca922d6..93793ad 100644 --- a/src/PiPedalModel.hpp +++ b/src/PiPedalModel.hpp @@ -154,7 +154,7 @@ public: PiPedalModel(); virtual ~PiPedalModel(); - + uint16_t GetWebPort() const { return webPort; } void Close(); void UpdateDnsSd(); diff --git a/src/PiPedalSocket.cpp b/src/PiPedalSocket.cpp index 21d8b52..ddc9a51 100644 --- a/src/PiPedalSocket.cpp +++ b/src/PiPedalSocket.cpp @@ -926,7 +926,7 @@ public: } else if (message == "version") { - PiPedalVersion version; + PiPedalVersion version(this->model); Reply(replyTo, "version", version); } diff --git a/src/PiPedalVersion.cpp b/src/PiPedalVersion.cpp index 98bf328..47d7b6c 100644 --- a/src/PiPedalVersion.cpp +++ b/src/PiPedalVersion.cpp @@ -18,8 +18,10 @@ // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "pch.h" +#include "PiPedalModel.hpp" #include "config.hpp" #include "PiPedalVersion.hpp" +#include "Ipv6Helpers.hpp" #ifdef _WIN32 #include "windows.h" @@ -36,9 +38,21 @@ JSON_MAP_BEGIN(PiPedalVersion) JSON_MAP_REFERENCE(PiPedalVersion,operatingSystem) JSON_MAP_REFERENCE(PiPedalVersion,osVersion) JSON_MAP_REFERENCE(PiPedalVersion,debug) + JSON_MAP_REFERENCE(PiPedalVersion,webAddresses) JSON_MAP_END() -PiPedalVersion::PiPedalVersion() + +static std::string MakeWebAddress(const std::string &address, uint16_t port) +{ + if (port == 80) + { + return SS("http://" << address << '/'); + } else { + return SS("http://" << address << ':' << port << '/'); + } +} + +PiPedalVersion::PiPedalVersion(PiPedalModel&model) { server_ = "PiPedal Server"; // defined on build command line. @@ -71,4 +85,31 @@ PiPedalVersion::PiPedalVersion() #else debug_ = false; #endif + + uint16_t port = model.GetWebPort(); + + char hostName[512]; + gethostname(hostName,sizeof(hostName)); + + this->webAddresses_.push_back(MakeWebAddress(SS(hostName << ".local"),port)); + + std::string ethAddr = GetInterfaceIpv4Address("eth0"); + if (ethAddr.length() != 0) + { + this->webAddresses_.push_back(MakeWebAddress(ethAddr,port)); + } + std::string wlanAddr = GetInterfaceIpv4Address("wlan0"); + if (wlanAddr.length() != 0) + { + this->webAddresses_.push_back(MakeWebAddress(wlanAddr,port)); + + } + std::string p2pAddr = GetInterfaceIpv4Address("p2p-wlan0-0"); + if (p2pAddr.length() != 0) + { + this->webAddresses_.push_back(MakeWebAddress(p2pAddr,port)); + + } + + } diff --git a/src/PiPedalVersion.hpp b/src/PiPedalVersion.hpp index cc3bf93..88e8df7 100644 --- a/src/PiPedalVersion.hpp +++ b/src/PiPedalVersion.hpp @@ -21,6 +21,8 @@ #include "json.hpp" namespace pipedal { + +class PiPedalModel; class PiPedalVersion { private: @@ -28,10 +30,11 @@ private: std::string serverVersion_; std::string operatingSystem_; std::string osVersion_; + std::vector webAddresses_; bool debug_; public: - PiPedalVersion(); + PiPedalVersion(PiPedalModel&model); ~PiPedalVersion() = default;