diff options
Diffstat (limited to 'src/main_gui.cpp')
| -rw-r--r-- | src/main_gui.cpp | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/src/main_gui.cpp b/src/main_gui.cpp new file mode 100644 index 0000000..b7377da --- /dev/null +++ b/src/main_gui.cpp | |||
| @@ -0,0 +1,169 @@ | |||
| 1 | // Bitflash entry point — starts node threads then runs GUI (or headless). | ||
| 2 | |||
| 3 | #include "headers_core.h" | ||
| 4 | #ifndef _WIN32 | ||
| 5 | #include <csignal> | ||
| 6 | #endif | ||
| 7 | |||
| 8 | int RunGUI(int argc, char* argv[]); | ||
| 9 | |||
| 10 | // Global definitions (were in ui.cpp, now here) | ||
| 11 | map<string,string> mapAddressBook; | ||
| 12 | bool gPoolServerRunning = false; | ||
| 13 | |||
| 14 | static bool arg(int argc, char* argv[], const char* key) | ||
| 15 | { | ||
| 16 | for (int i=1;i<argc;i++) { string s=argv[i]; if(s==key||s.substr(0,s.find('='))==key) return true; } | ||
| 17 | return false; | ||
| 18 | } | ||
| 19 | static string argval(int argc, char* argv[], const char* key) | ||
| 20 | { | ||
| 21 | for (int i=1;i<argc;i++) { | ||
| 22 | string s=argv[i]; size_t eq=s.find('='); | ||
| 23 | if(eq!=string::npos && s.substr(0,eq)==key) return s.substr(eq+1); | ||
| 24 | } | ||
| 25 | return ""; | ||
| 26 | } | ||
| 27 | |||
| 28 | static string argval2(int argc, char* argv[], const char* keySlash, const char* keyDash) | ||
| 29 | { | ||
| 30 | string v = argval(argc, argv, keySlash); | ||
| 31 | if (!v.empty()) | ||
| 32 | return v; | ||
| 33 | return argval(argc, argv, keyDash); | ||
| 34 | } | ||
| 35 | |||
| 36 | static void PrintUsage() | ||
| 37 | { | ||
| 38 | printf("Bitflash command-line options\n"); | ||
| 39 | printf("\n"); | ||
| 40 | printf("General:\n"); | ||
| 41 | printf(" /help, -help, --help, /?\n"); | ||
| 42 | printf(" /datadir=PATH\n"); | ||
| 43 | printf(" /debug\n"); | ||
| 44 | printf(" /gen\n"); | ||
| 45 | printf(" /nogui or /daemon\n"); | ||
| 46 | printf("\n"); | ||
| 47 | printf("Mining mode:\n"); | ||
| 48 | printf(" /operator\n"); | ||
| 49 | printf(" /participant=POOL_BTF_ADDRESS\n"); | ||
| 50 | printf(" /solomine\n"); | ||
| 51 | printf("\n"); | ||
| 52 | printf("Pool operator announcement:\n"); | ||
| 53 | printf(" /poolname=NAME\n"); | ||
| 54 | printf(" /poolfee=PCT\n"); | ||
| 55 | printf(" /pooldashboard=URL (alias: /pooldash=URL)\n"); | ||
| 56 | printf("\n"); | ||
| 57 | printf(".btf and rendezvous:\n"); | ||
| 58 | printf(" /connectbtf=PEER_BTF_ADDRESS\n"); | ||
| 59 | printf(" /rvrelay=HOST:PORT\n"); | ||
| 60 | printf(" /announcerelay=HOST:PORT\n"); | ||
| 61 | printf("\n"); | ||
| 62 | printf("Each option also accepts '-' instead of '/'.\n"); | ||
| 63 | } | ||
| 64 | |||
| 65 | static void ParseStartupArguments(int argc, char* argv[]) | ||
| 66 | { | ||
| 67 | if (arg(argc,argv,"/datadir") || arg(argc,argv,"-datadir")) | ||
| 68 | strSetDataDir = argval2(argc, argv, "/datadir", "-datadir"); | ||
| 69 | |||
| 70 | if (arg(argc,argv,"/debug") || arg(argc,argv,"-debug")) | ||
| 71 | fDebug = true; | ||
| 72 | |||
| 73 | if (arg(argc,argv,"/gen") || arg(argc,argv,"-gen")) | ||
| 74 | fGenerateBitcoins = 1; | ||
| 75 | |||
| 76 | if (arg(argc,argv,"/solomine") || arg(argc,argv,"-solomine")) | ||
| 77 | fSoloMineTest = true; | ||
| 78 | |||
| 79 | if (arg(argc,argv,"/operator") || arg(argc,argv,"-operator")) | ||
| 80 | nMineMode = MINE_OPERATOR; | ||
| 81 | |||
| 82 | if (arg(argc,argv,"/participant") || arg(argc,argv,"-participant")) | ||
| 83 | { | ||
| 84 | nMineMode = MINE_PARTICIPANT; | ||
| 85 | strParticipantPool = argval2(argc, argv, "/participant", "-participant"); | ||
| 86 | } | ||
| 87 | |||
| 88 | string poolName = argval2(argc, argv, "/poolname", "-poolname"); | ||
| 89 | if (!poolName.empty()) | ||
| 90 | strPoolName = poolName; | ||
| 91 | |||
| 92 | string poolDash = argval2(argc, argv, "/pooldashboard", "-pooldashboard"); | ||
| 93 | if (poolDash.empty()) | ||
| 94 | poolDash = argval2(argc, argv, "/pooldash", "-pooldash"); | ||
| 95 | if (!poolDash.empty()) | ||
| 96 | strPoolDashboardUrl = poolDash; | ||
| 97 | |||
| 98 | string poolFee = argval2(argc, argv, "/poolfee", "-poolfee"); | ||
| 99 | if (!poolFee.empty()) | ||
| 100 | dPoolFeePercent = atof(poolFee.c_str()); | ||
| 101 | |||
| 102 | string btfConnect = argval2(argc, argv, "/connectbtf", "-connectbtf"); | ||
| 103 | if (!btfConnect.empty()) | ||
| 104 | strBtfConnect = btfConnect; | ||
| 105 | |||
| 106 | string rvRelay = argval2(argc, argv, "/rvrelay", "-rvrelay"); | ||
| 107 | if (!rvRelay.empty()) | ||
| 108 | { | ||
| 109 | vBtfMeetingRelays.clear(); | ||
| 110 | vBtfMeetingRelays.push_back(rvRelay); | ||
| 111 | } | ||
| 112 | |||
| 113 | string announceRelay = argval2(argc, argv, "/announcerelay", "-announcerelay"); | ||
| 114 | if (!announceRelay.empty()) | ||
| 115 | strBtfAnnounceRelay = announceRelay; | ||
| 116 | } | ||
| 117 | |||
| 118 | int main(int argc, char* argv[]) | ||
| 119 | { | ||
| 120 | if (arg(argc,argv,"/help") || arg(argc,argv,"-help") || | ||
| 121 | arg(argc,argv,"--help") || arg(argc,argv,"/?")) | ||
| 122 | { | ||
| 123 | PrintUsage(); | ||
| 124 | return 0; | ||
| 125 | } | ||
| 126 | |||
| 127 | ParseStartupArguments(argc, argv); | ||
| 128 | |||
| 129 | printf("Loading addresses...\n"); | ||
| 130 | if (!LoadAddresses()) printf("Warning: error loading addr.dat\n"); | ||
| 131 | printf("Loading block index...\n"); | ||
| 132 | string strErrors; | ||
| 133 | if (!LoadBlockIndex()) { fprintf(stderr,"LoadBlockIndex failed\n"); return 1; } | ||
| 134 | printf("Loading wallet...\n"); | ||
| 135 | if (!LoadWallet()) { fprintf(stderr,"LoadWallet failed\n"); return 1; } | ||
| 136 | printf("Height=%d\n", nBestHeight); | ||
| 137 | ReacceptWalletTransactions(); | ||
| 138 | |||
| 139 | if (!StartNode(strErrors)) { fprintf(stderr,"StartNode: %s\n",strErrors.c_str()); return 1; } | ||
| 140 | |||
| 141 | if (nMineMode == MINE_OPERATOR) { | ||
| 142 | gPoolServerRunning = true; | ||
| 143 | gPoolRunning = true; | ||
| 144 | if (_beginthread(ThreadRPCServer, 0, NULL) == (uintptr_t)-1) | ||
| 145 | printf("Error: _beginthread(ThreadRPCServer) failed\n"); | ||
| 146 | } | ||
| 147 | if (fGenerateBitcoins) | ||
| 148 | if (_beginthread(ThreadBitcoinMiner, 0, NULL) == (uintptr_t)-1) | ||
| 149 | printf("Error: _beginthread(ThreadBitcoinMiner) failed\n"); | ||
| 150 | |||
| 151 | bool fHeadless = arg(argc,argv,"/nogui") || arg(argc,argv,"-nogui") || | ||
| 152 | arg(argc,argv,"/daemon") || arg(argc,argv,"-daemon"); | ||
| 153 | |||
| 154 | if (fHeadless) { | ||
| 155 | #ifndef _WIN32 | ||
| 156 | auto sig=[](int){fShutdown=true;}; | ||
| 157 | signal(SIGINT,sig); signal(SIGTERM,sig); | ||
| 158 | #endif | ||
| 159 | printf("Running headless. Ctrl-C to stop.\n"); | ||
| 160 | while (!fShutdown) Sleep(500); | ||
| 161 | StopNode(); | ||
| 162 | return 0; | ||
| 163 | } | ||
| 164 | |||
| 165 | int ret = RunGUI(argc, argv); | ||
| 166 | fShutdown = true; | ||
| 167 | StopNode(); | ||
| 168 | return ret; | ||
| 169 | } | ||