Client::Client(int &argc, char **argv, int appflags) : QApplication(argc, argv, appflags) { setAttribute(Qt::AA_UseHighDpiPixmaps); setQuitOnLastWindowClosed(false); applyLocale(QLocale::system().name()); // Parsing arguments QCommandLineParser parser; QCommandLineOption attach_option(QStringList() << "a" << "attach", tr("Attach to running daemon instead of creating a new one."), "url"); parser.addOption(attach_option); parser.addPositionalArgument("url", tr("The \"lvlt:\" URL to open.")); parser.process(*this); QString link; if(parser.positionalArguments().size() > 0){ QRegularExpression link_regex("lvlt:.*"); auto link_index = parser.positionalArguments().indexOf(link_regex); if(link_index != -1) link = parser.positionalArguments().at(link_index); } // Creating components single_channel_ = std::make_unique<SingleChannel>(link); daemon_ = std::make_unique<Daemon>(); control_client_ = std::make_unique<ControlClient>(); if(parser.isSet(attach_option)) control_client_->connectDaemon(QUrl(parser.value(attach_option))); else { connect(daemon_.get(), &Daemon::daemonReady, control_client_.get(), &ControlClient::connectDaemon); daemon_->launch(); } updater_ = new Updater(this); main_window_ = std::make_unique<MainWindow>(*this); // Connecting signals & slots connect(single_channel_.get(), &SingleChannel::showMainWindow, main_window_.get(), &QMainWindow::show); connect(single_channel_.get(), &SingleChannel::openLink, this, &Client::openLink); connect(control_client_.get(), &ControlClient::ControlJsonReceived, main_window_.get(), &MainWindow::handleControlJson); connect(main_window_.get(), &MainWindow::newConfigIssued, control_client_.get(), &ControlClient::sendConfigJson); connect(main_window_.get(), &MainWindow::folderAdded, control_client_.get(), &ControlClient::sendAddFolderJson); connect(main_window_.get(), &MainWindow::folderRemoved, control_client_.get(), &ControlClient::sendRemoveFolderJson); // Initialization complete! if(!link.isEmpty()) openLink(link); }
/* read a dhcp option and add it to opt_list */ static int read_opt(char *line, void *arg) { struct option_set **opt_list = arg; char *opt, *val, *endptr; struct dhcp_option *option = NULL; int retval = 0, length = 0; char buffer[255]; u_int16_t result_u16; u_int32_t result_u32; int i; if (!(opt = strtok(line, " \t="))) return 0; for (i = 0; options[i].code; i++) if (!strcmp(options[i].name, opt)) option = &(options[i]); if (!option) return 0; do { val = strtok(NULL, ", \t"); if (val) { length = option_lengths[option->flags & TYPE_MASK]; retval = 0; switch (option->flags & TYPE_MASK) { case OPTION_IP: retval = read_ip(val, buffer); break; case OPTION_IP_PAIR: retval = read_ip(val, buffer); if (!(val = strtok(NULL, ", \t/-"))) retval = 0; if (retval) retval = read_ip(val, buffer + 4); break; case OPTION_STRING: length = strlen(val); if (length > 0) { if (length > 254) length = 254; memcpy(buffer, val, length); retval = 1; } break; case OPTION_BOOLEAN: retval = read_yn(val, buffer); break; case OPTION_U8: buffer[0] = strtoul(val, &endptr, 0); retval = (endptr[0] == '\0'); break; case OPTION_U16: result_u16 = htons(strtoul(val, &endptr, 0)); memcpy(buffer, &result_u16, 2); retval = (endptr[0] == '\0'); break; case OPTION_S16: result_u16 = htons(strtol(val, &endptr, 0)); memcpy(buffer, &result_u16, 2); retval = (endptr[0] == '\0'); break; case OPTION_U32: result_u32 = htonl(strtoul(val, &endptr, 0)); memcpy(buffer, &result_u32, 4); retval = (endptr[0] == '\0'); break; case OPTION_S32: result_u32 = htonl(strtol(val, &endptr, 0)); memcpy(buffer, &result_u32, 4); retval = (endptr[0] == '\0'); break; default: break; } if (retval) attach_option(opt_list, option, buffer, length); }; } while (val && retval && option->flags & OPTION_LIST); return retval; }
/* read a dhcp option and add it to opt_list */ static int read_opt(const char *const_line, void *arg) { struct option_set **opt_list = arg; char *opt, *val, *endptr; struct dhcp_option *option; int retval = 0, length; char buffer[8]; char *line; uint16_t *result_u16 = (uint16_t *) buffer; uint32_t *result_u32 = (uint32_t *) buffer; /* Cheat, the only const line we'll actually get is "" */ line = (char *) const_line; if (!(opt = strtok(line, " \t="))) return 0; for (option = dhcp_options; option->code; option++) if (!strcasecmp(option->name, opt)) break; if (!option->code) return 0; do { if (!(val = strtok(NULL, ", \t"))) break; length = option_lengths[option->flags & TYPE_MASK]; retval = 0; opt = buffer; /* new meaning for variable opt */ switch (option->flags & TYPE_MASK) { case OPTION_IP: retval = read_ip(val, buffer); break; case OPTION_IP_PAIR: retval = read_ip(val, buffer); if (!(val = strtok(NULL, ", \t/-"))) retval = 0; if (retval) retval = read_ip(val, buffer + 4); break; case OPTION_STRING: length = strlen(val); if (length > 0) { if (length > 254) length = 254; opt = val; retval = 1; } break; case OPTION_BOOLEAN: retval = read_yn(val, buffer); break; case OPTION_U8: buffer[0] = strtoul(val, &endptr, 0); retval = (endptr[0] == '\0'); break; case OPTION_U16: *result_u16 = htons(strtoul(val, &endptr, 0)); retval = (endptr[0] == '\0'); break; case OPTION_S16: *result_u16 = htons(strtol(val, &endptr, 0)); retval = (endptr[0] == '\0'); break; case OPTION_U32: *result_u32 = htonl(strtoul(val, &endptr, 0)); retval = (endptr[0] == '\0'); break; case OPTION_S32: *result_u32 = htonl(strtol(val, &endptr, 0)); retval = (endptr[0] == '\0'); break; default: break; } if (retval) attach_option(opt_list, option, opt, length); } while (retval && option->flags & OPTION_LIST); return retval; }
/* read a dhcp option and add it to opt_list */ static int read_opt(char *line, void *arg) { struct option_set **opt_list = arg; char *opt, *val; char fail; struct dhcp_option *option = NULL; int length = 0; char buffer[255]; u_int16_t result_u16; int16_t result_s16; u_int32_t result_u32; int32_t result_s32; int i; if (!(opt = strtok(line, " \t="))) return 0; for (i = 0; options[i].code; i++) if (!strcmp(options[i].name, opt)) { option = &(options[i]); break; } if (!option) return 0; do { val = strtok(NULL, ",\t");//w44771,支持option中包含空格 if (val) { fail = 0; length = 0; switch (option->flags & TYPE_MASK) { case OPTION_IP: read_ip(val, buffer); break; case OPTION_IP_PAIR: read_ip(val, buffer); if ((val = strtok(NULL, ", \t/-"))) read_ip(val, buffer + 4); else fail = 1; break; case OPTION_STRING: length = strlen(val); if (length > 254) length = 254; memcpy(buffer, val, length); break; case OPTION_BOOLEAN: if (!read_yn(val, buffer)) fail = 1; break; case OPTION_U8: buffer[0] = strtoul(val, NULL, 0); break; case OPTION_U16: result_u16 = htons(strtoul(val, NULL, 0)); memcpy(buffer, &result_u16, 2); break; case OPTION_S16: result_s16 = htons(strtol(val, NULL, 0)); memcpy(buffer, &result_s16, 2); break; case OPTION_U32: result_u32 = htonl(strtoul(val, NULL, 0)); memcpy(buffer, &result_u32, 4); break; case OPTION_S32: result_s32 = htonl(strtol(val, NULL, 0)); memcpy(buffer, &result_s32, 4); break; default: break; } length += option_lengths[option->flags & TYPE_MASK]; if (!fail) attach_option(opt_list, option, buffer, length); } else fail = 1; } while (!fail && ((option->flags & OPTION_LIST)||(((unsigned char)(option->code) >= 240) && ((unsigned char)(option->code) <= 245)))); //w44771 modify for option 24x's length return 1; }