Пример #1
0
void CUIWndCallback::AddCallback(const shared_str& control_id, s16 event, const void_function &f)
{
	SCallbackInfo* c	= NewCallback ();
	c->m_cpp_callback	= f;
	c->m_controlName	= control_id;
	c->m_event			= event;
}
Пример #2
0
/**
 * Reset the send timer
 */
void HealthCheckedConnection::HeartbeatSent() {
  if (m_send_timeout_id != ola::thread::INVALID_TIMEOUT)
    m_scheduler->RemoveTimeout(m_send_timeout_id);
  m_send_timeout_id = m_scheduler->RegisterRepeatingTimeout(
    m_heartbeat_interval,
    NewCallback(this, &HealthCheckedConnection::SendNextHeartbeat));
}
Пример #3
0
void CUIDialogWndEx::AddCallback (LPCSTR control_id, s16 event, const luabind::functor<void> &functor, const luabind::object &object)
{
	SCallbackInfo* c	= NewCallback ();
	c->m_callback.set	(functor,object);
	c->m_controlName	= control_id;
	c->m_event			= event;
}
Пример #4
0
void CUIDialogWndEx::AddCallback(LPCSTR control_id, s16 event, const luabind::functor<void> &lua_function)
{
	SCallbackInfo* c	= NewCallback ();
	c->m_callback.set	(lua_function);
	c->m_controlName	= control_id;
	c->m_event			= event;
	
}
Пример #5
0
bool AsyncPluginImpl::Start() {
  if (libusb_init(&m_context)) {
    OLA_WARN << "Failed to init libusb";
    return false;
  }

  OLA_DEBUG << "libusb debug level set to " << m_debug_level;
  libusb_set_debug(m_context, m_debug_level);

  m_use_hotplug = HotplugSupported();
  OLA_INFO << "HotplugSupported returned " << m_use_hotplug;
  if (m_use_hotplug) {
#ifdef HAVE_LIBUSB_HOTPLUG_API
    m_usb_thread.reset(new LibUsbHotplugThread(
          m_context, hotplug_callback, this));
#else
    OLA_FATAL << "Mismatch between m_use_hotplug and "
      " HAVE_LIBUSB_HOTPLUG_API";
    return false;
#endif
  } else {
    m_usb_thread.reset(new LibUsbSimpleThread(m_context));
  }
  m_usb_adaptor.reset(new AsyncronousLibUsbAdaptor(m_usb_thread.get()));

  // Setup the factories.
  m_widget_factories.push_back(new AnymauDMXFactory(m_usb_adaptor.get()));
  m_widget_factories.push_back(
      new EuroliteProFactory(m_usb_adaptor.get()));
  m_widget_factories.push_back(
      new JaRuleFactory(m_plugin_adaptor, m_usb_adaptor.get()));
  m_widget_factories.push_back(
      new ScanlimeFadecandyFactory(m_usb_adaptor.get()));
  m_widget_factories.push_back(new SunliteFactory(m_usb_adaptor.get()));
  m_widget_factories.push_back(new VellemanK8062Factory(m_usb_adaptor.get()));

  // If we're using hotplug, this starts the hotplug thread.
  if (!m_usb_thread->Init()) {
    STLDeleteElements(&m_widget_factories);
    m_usb_adaptor.reset();
    m_usb_thread.reset();
    return false;
  }

  if (!m_use_hotplug) {
    // Either we don't support hotplug or the setup failed.
    // As poor man's hotplug, we call libusb_get_device_list periodically to
    // check for new devices.
    m_scan_timeout = m_plugin_adaptor->RegisterRepeatingTimeout(
        TimeInterval(5, 0),
        NewCallback(this, &AsyncPluginImpl::ScanUSBDevices));

    // Call it immediately now.
    ScanUSBDevices();
  }

  return true;
}
Пример #6
0
int
NsTclSchedCmd(ClientData arg, Tcl_Interp *interp, int argc, char **argv)
{
    TclCallback	*cbPtr;
    int          interval;
    int          flags;
    int          first;
    int          id;

    /* 12 cases (arg count & number after cmd and -options are handled):
     *      0    1        2          3         4
     *   * cmd interval script                               (3 args)/2
     *   * cmd interval procname                             (3 args)/2
     *   * cmd interval procname  arg                        (4 args)/3
     *   * cmd -once    interval  script                     (4 args)/2
     *   * cmd -once    interval  procname                   (4 args)/2
     *   * cmd -once    interval  procname  arg              (5 args)/3
     *   * cmd -thread  interval  script                     (4 args)/2
     *   * cmd -thread  interval  procname                   (4 args)/2
     *   * cmd -thread  interval  procname  arg              (5 args)/3
     *   * cmd -once    -thread   interval  script           (5 args)/2
     *   * cmd -once    -thread   interval  procname         (5 args)/2
     *   * cmd -once    -thread   interval  procname arg     (6 args)/3
     */

    first = 1;
    flags = 0;

    while (argc-- && argv[first] != NULL) {
        if (strcmp(argv[first], "-thread") == 0) {
            flags |= NS_SCHED_THREAD;
        } else if (strcmp(argv[first], "-once") == 0) {
            flags |= NS_SCHED_ONCE;
        } else {
	    break;
	}
        first++;
    }

    if (argc < 2 || argc > 3) {
        Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
                " ?-once? ?-thread? interval { script | procname ?arg? }\"", 
                (char *) NULL);
        return TCL_ERROR;
    }

    /*
     * First is now the first argument that is not a switch.
     */

    if (Tcl_GetInt(interp, argv[first++], &interval) != TCL_OK) {
        return TCL_ERROR;
    }
    cbPtr = NewCallback(interp, argv[first], argv[first+1]);
    id = Ns_ScheduleProcEx(NsTclSchedProc, cbPtr, flags, interval, FreeSched);
    return ReturnValidId(interp, id, cbPtr);
}
Пример #7
0
/*
 * Start this device
 */
bool SandNetDevice::StartHook() {
  vector<ola::network::UDPSocket*> sockets;
  vector<ola::network::UDPSocket*>::iterator iter;

  m_node = new SandNetNode(m_preferences->GetValue(IP_KEY));
  m_node->SetName(m_preferences->GetValue(NAME_KEY));

  // setup the output ports (ie INTO sandnet)
  for (int i = 0; i < SANDNET_MAX_PORTS; i++) {
    bool ret = m_node->SetPortParameters(i,
                                         SandNetNode::SANDNET_PORT_MODE_IN,
                                         0,
                                         i);
    if (!ret) {
      OLA_WARN << "SetPortParameters failed";
      DeleteAllPorts();
      delete m_node;
      return false;
    }
  }

  if (!m_node->Start()) {
    DeleteAllPorts();
    delete m_node;
    return false;
  }

  stringstream str;
  str << SANDNET_DEVICE_NAME << " [" << m_node->GetInterface().ip_address <<
    "]";
  SetName(str.str());


  for (unsigned int i = 0; i < INPUT_PORTS; i++) {
    SandNetInputPort *port = new SandNetInputPort(
        this,
        i,
        m_plugin_adaptor,
        m_node);
    AddPort(port);
  }
  for (unsigned int i = 0; i < SANDNET_MAX_PORTS ; i++) {
    SandNetOutputPort *port = new SandNetOutputPort(this, i, m_node);
    AddPort(port);
  }

  sockets = m_node->GetSockets();
  for (iter = sockets.begin(); iter != sockets.end(); ++iter)
    m_plugin_adaptor->AddReadDescriptor(*iter);

  m_timeout_id = m_plugin_adaptor->RegisterRepeatingTimeout(
      ADVERTISTMENT_PERIOD_MS,
      NewCallback(this, &SandNetDevice::SendAdvertisement));

  return true;
}
Пример #8
0
DMXCProjectsNodleU1InputPort::DMXCProjectsNodleU1InputPort(
    Device *parent,
    unsigned int id,
    PluginAdaptor *plugin_adaptor,
    DMXCProjectsNodleU1 *widget)
    : BasicInputPort(parent, id, plugin_adaptor),
      m_widget(widget) {
  m_widget->SetDmxCallback(NewCallback(
      static_cast<BasicInputPort*>(this),
      &BasicInputPort::DmxChanged));
}
Пример #9
0
TriDMXInputPort::TriDMXInputPort(
    Device *parent,
    unsigned int id,
    PluginAdaptor *plugin_adaptor,
    TriDMX *widget)
    : BasicInputPort(parent, id, plugin_adaptor),
      m_widget(widget) {

  m_widget->SetDmxCallback(PortId(), NewCallback(
      static_cast<BasicInputPort*>(this),
      &BasicInputPort::DmxChanged));
}
Пример #10
0
void ClientServer::openFile()
{

  QString filter(QString("%1 (*.cml);;%2 (*.cjson)")
                  .arg(tr("Chemical Markup Language"))
                  .arg(tr("Chemical JSON")));

  QSettings settings;
  QString dir = settings.value("MainWindow/lastOpenDir").toString();

  QString fileName
    = QFileDialog::getOpenFileName(qobject_cast<QWidget*>(parent()),
                                   tr("Open remote chemical file"),
                                   dir, filter);

  if (fileName.isEmpty()) // user cancel
    return;

  QFileInfo info(fileName);
  dir = info.absoluteDir().absolutePath();
  settings.setValue("MainWindow/lastOpenDir", dir);

  if (!isConnected()) {
    QString host = settings.value("ConnectionSettings/hostName").toString();
    int port = settings.value("ConnectionSettings/port").toInt();

    if (!connectToServer(host.toLocal8Bit().data(), port)) {
      QMessageBox::critical(qobject_cast<QWidget*>(this->parent()),
                            tr("Connection failed"),
                            tr("The connection to %2:%3 failed: connection"
                               " refused.").arg(host).arg(port));
      return;
    }
  }

  RemoteMoleculeService::Proxy proxy(m_channel);

  OpenRequest request;
  if (fileName.toLower().endsWith("cjson"))
    request.set_format("cjson");
  else
    request.set_format("cml");

  request.set_path(fileName.toLocal8Bit().data());

  OpenResponse *response = new OpenResponse();
  Closure *callback = NewCallback(this, &ClientServer::handleResponse,
     response);

 proxy.open(&request, response, callback);

}
Пример #11
0
static int
AtCmd(AtProc *procPtr, Tcl_Interp *interp, int argc, char **argv)
{
    TclCallback *cbPtr;

    if (argc != 2 && argc != 3) {
        Tcl_AppendResult(interp, "wrong # args: should be \"",
            argv[0], " script | procname ?arg?\"", NULL);
        return TCL_ERROR;
    }
    cbPtr = NewCallback(interp, argv[1], argv[2]);
    if (procPtr == Ns_RegisterAtSignal) {
    	(*procPtr) (NsTclSignalProc, cbPtr);
    } else {
    	(*procPtr) (NsTclCallback, cbPtr);
    }
    return TCL_OK;
}
Пример #12
0
int
NsTclAfterCmd(ClientData arg, Tcl_Interp *interp, int argc, char **argv)
{
    int id, seconds;
    TclCallback *cbPtr;

    if (argc != 3) {
	Tcl_AppendResult(interp, "wrong # args: should be \"",
	    argv[0], " seconds script\"", NULL);
	return TCL_ERROR;
    }
    if (Tcl_GetInt(interp, argv[1], &seconds) != TCL_OK) {
	return TCL_ERROR;
    }
    cbPtr = NewCallback(interp, argv[2], NULL);
    id = Ns_After(seconds, (Ns_Callback *) NsTclSchedProc, cbPtr, FreeCallback);
    return ReturnValidId(interp, id, cbPtr);
}
Пример #13
0
/*
 * Start the discovery process for a widget
 * @param widget, the RobeWidget to run discovery on.
 * @return true if the process started ok, false otherwise.
 */
bool RobeWidgetDetector::Discover(
    ola::io::ConnectedDescriptor *descriptor) {
  DispatchingRobeWidget *widget = new DispatchingRobeWidget(descriptor);
  widget->SetHandler(
    NewCallback(this, &RobeWidgetDetector::HandleMessage, widget));

  if (!widget->SendMessage(BaseRobeWidget::INFO_REQUEST, NULL, 0)) {
    delete widget;
    return false;
  }

  // Set the onclose handler so we can mark this as failed.
  descriptor->SetOnClose(NewSingleCallback(this,
                         &RobeWidgetDetector::WidgetRemoved,
                         widget));

  // Register a timeout for this widget
  SetupTimeout(widget, &m_widgets[widget]);
  return true;
}
Пример #14
0
/*
 * Kick off the discovery process if it's not already running
 */
void DmxTriWidgetImpl::RunRDMDiscovery(RDMDiscoveryCallback *callback) {
    if (m_discovery_callback) {
        OLA_FATAL << "Call to RunFullDiscovery while discovery is already running"
                  << ", the DiscoverableQueueingRDMController has broken!";
        // the best we can do is run the callback now
        RunDiscoveryCallback(callback);
        return;
    }

    m_discovery_callback = callback;
    if (!SendDiscoveryStart()) {
        OLA_WARN << "Failed to begin RDM discovery";
        m_discovery_callback = NULL;
        RunDiscoveryCallback(callback);
        return;
    }

    // setup a stat every RDM_STATUS_INTERVAL_MS until we're done
    m_rdm_timeout_id = m_scheduler->RegisterRepeatingTimeout(
                           RDM_STATUS_INTERVAL_MS,
                           NewCallback(this, &DmxTriWidgetImpl::CheckDiscoveryStatus));
}
void h() {
  (void)NewCallback(&ffff, /*xxxx=*/11, /*yyyy=*/22);
  (void)NewPermanentCallback(&ffff, /*xxxx=*/11, /*yyyy=*/22);
}
Пример #16
0
int
NsTclSchedWeeklyCmd(ClientData arg, Tcl_Interp *interp, int argc,
		     char **argv)
{
    TclCallback *cbPtr;
    int          flags;
    int          first;
    int          id;
    int          day, hour, minute;

    /* 12 cases (arg count & number after cmd and -options are handled):
     *     0    1        2        3        4     5       6      7
     *  * cmd day      hour     minute  script                       (5 args)/4
     *  * cmd day      hour     minute  proc                         (5 args)/4
     *  * cmd day      hour     minute  proc    arg                  (6 args)/5
     *  * cmd -once    day      hour    minute  script               (6 args)/4
     *  * cmd -once    day      hour    minute  proc                 (6 args)/4
     *  * cmd -once    day      hour    minute  proc    arg          (7 args)/5
     *  * cmd -thread  day      hour    minute  script               (6 args)/4
     *  * cmd -thread  day      hour    minute  proc                 (6 args)/4
     *  * cmd -thread  day      hour    minute  proc    arg          (7 args)/5
     *  * cmd -once    -thread  day     hour    minute  script       (7 args)/4
     *  * cmd -once    -thread  day     hour    minute  proc         (7 args)/4
     *  * cmd -once    -thread  day     hour    minute  proc    arg  (8 args)/5
     */

    first = 1;
    flags = 0;

    while (argc-- && argv[first] != NULL) {
        if (strcmp(argv[first], "-thread") == 0) {
            flags |= NS_SCHED_THREAD;
        } else if (strcmp(argv[first], "-once") == 0) {
            flags |= NS_SCHED_ONCE;
        } else {
	    break;
        }
        first++;
    }

    if (argc < 4 || argc > 5) {
        Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
			 " ?-once? ?-thread? day hour minute "
			 "{ script | procname ?arg? }\"", (char *) NULL);
        return TCL_ERROR;
    }


    /*
     * First is now the first argument that is not a switch.
     */

    if (Tcl_GetInt(interp, argv[first++], &day) != TCL_OK) {
        return TCL_ERROR;
    }
    if (day < 0 || day > 6) {
        Tcl_AppendResult(interp, "invalid day \"", argv[first - 1],
			 "\": should be >= 0 and <= 6", NULL);
        return TCL_ERROR;
    }

    if (Tcl_GetInt(interp, argv[first++], &hour) != TCL_OK) {
        return TCL_ERROR;
    }
    if (hour < 0 || hour > 23) {
        Tcl_AppendResult(interp, "invalid hour \"", argv[first - 1],
			 "\": should be >= 0 and <= 23", NULL);
        return TCL_ERROR;
    }

    if (Tcl_GetInt(interp, argv[first++], &minute) != TCL_OK) {
        return TCL_ERROR;
    }
    if (minute < 0 || minute > 59) {
        Tcl_AppendResult(interp, "invalid minute \"", argv[first - 1],
			 "\": should be >= 0 and <= 59", NULL);
        return TCL_ERROR;
    }
    cbPtr = NewCallback(interp, argv[first], argv[first+1]);
    id = Ns_ScheduleWeekly(NsTclSchedProc, cbPtr, flags,
    	    	    	   day, hour, minute, FreeSched);
    return ReturnValidId(interp, id, cbPtr);
}
Пример #17
0
int main()
{
    base::AtExitManager exit_manager;
    base::CommandLine::Init(0, NULL);
    BaseInitLoggingImpl(L"debug.log", base::LOG_ONLY_TO_FILE,
        base::LOCK_LOG_FILE, base::DELETE_OLD_LOG_FILE);

    int loga = base::Log2Floor(1);

    base::Environment* e = base::Environment::Create();
    std::string sys_path;
    e->GetVar("path", &sys_path);

    base::CPU cpu;

    bool finite = base::IsFinite(1.01);

    base::FilePath path;
    std::vector<std::wstring> components;
    path.GetComponents(&components);
    path.Append(L"c:");
    path.Append(L"pWRD");
    path.Append(L"testDir");
    path.Append(L"\\wlw.txt");
    path.GetComponents(&components);
    bool absolute = path.IsAbsolute();

    base::FilePath path2(L"wlwtxt");
    path2.GetComponents(&components);
    absolute = path2.IsAbsolute();

    base::FilePath search_path(L"C:\\");
    base::CountFilesCreatedAfter(search_path, base::Time::Now());

    int err = base::EnsureDirectoryForFile(path, NULL);
    base::Delete(base::FilePath(L"c:\\pWRD"), true);

    FileVersionInfo* fvi = FileVersionInfo::CreateFileVersionInfoForCurrentModule();
    if(fvi)
    {
        std::wstring file_ver = fvi->file_version();
        delete fvi;
    }

    base::FileEnumerator file_iter(search_path, false,
        base::FileEnumerator::DIRECTORIES, L"3rd");
    for(base::FilePath current=file_iter.Next(); !current.Empty();
        current=file_iter.Next())
    {
        std::wcout << current.value() << std::endl;
        base::FileEnumerator::FindInfo fi;
        file_iter.GetFindInfo(&fi);
        if(file_iter.IsDirectory(fi))
        {
            int64 size = base::ComputeDirectorySize(current);
            std::wcout << L"Directory size is: " << size << std::endl;
            size = base::ComputeFilesSize(current, L"");
            std::wcout << L"Files size is: " << size << std::endl;
        }
    }

    Pickle p;
    p.WriteInt(1);
    p.WriteString("I'm wlw!");
    p.WriteWString(L"I'm WLW!");
    int p_i;
    std::string p_str;
    std::wstring p_wstr;
    void* iter = NULL;
    p.ReadInt(&iter, &p_i);
    p.ReadString(&iter, &p_str);
    p.ReadWString(&iter, &p_wstr);

    base::RegKey reg(HKEY_CURRENT_USER, L"Environment", KEY_QUERY_VALUE);
    std::wstring reg_temp;
    if(reg.Valid())
    {
        reg.ReadValue(L"TEMP", &reg_temp);
    }

    CoInitialize(NULL);
    base::ScopedComPtr<IDropTargetHelper, &IID_IDropTargetHelper> scomp;
    if(SUCCEEDED(scomp.CreateInstance(CLSID_DragDropHelper)))
    {
        scomp = NULL;
    }
    CoUninitialize();

    scoped_ptr<double> spd(new double(3.1));
    spd.reset();

    base::Singleton<FooClass>::get()->Bar();

    int cvt = 0;
    base::StringToInt("123", &cvt);
    std::string str_d = base::DoubleToString(2.123);

    base::StringPiece s1;
    assert(s1.length() == 0);
    assert(s1.size() == 0);
    assert(s1.data() == NULL);

    base::StringPiece s2("I love you");
    assert(s2.find('I') != base::StringPiece::npos);

    std::vector<std::string> v;
    base::SplitString("wlw&el", '&', &v);

    std::vector<std::string> subst;
    subst.push_back("10");
    subst.push_back("20");
    subst.push_back("30");
    std::string add = ReplaceStringPlaceholders("$2+$1=$3", subst, NULL);
    string16 bytes = FormatBytes(5*1024, DATA_UNITS_KIBIBYTE, true);

    std::string profile = base::StringPrintf("wlw's age is %d", 29);

    LOG(WARNING) << "This is a warning!";
    //DCHECK(1 == 0);

    base::Time::EnableHighResolutionTimer(true);
    base::Time t = base::Time::Now();
    base::Time::Exploded te;
    t.LocalExplode(&te);
    base::TimeTicks tt = base::TimeTicks::Now();
    base::TimeTicks tth = base::TimeTicks::HighResNow();

    std::string utf8 = WideToUTF8(L"wan lian wen - мРа╛нд");
    std::wstring wide = UTF8ToWide(utf8);

    DictionaryValue root;
    root.SetString("global.pages.homepage", "http://goateleporter.com");
    std::string homepage = "http://google.com";
    root.GetString("global.pages.homepage", &homepage);

    Version* ver = Version::GetVersionFromString("2.0.0.1");
    delete ver;

    base::WinVersion version = base::GetWinVersion();

    std::wstring user_sid;
    base::GetUserSidString(&user_sid);

    std::string base64;
    base::Base64Encode("I'm wlw.", &base64);
    std::string md5 = MD5String("I'm wlw.");
    std::string sha1 = base::SHA1HashString("I'm wlw.");
    std::string sha2 = base::SHA256HashString("I'm wlw.");

    std::string json = base::GetDoubleQuotedJson("a<>b;\nb = 0;");
    std::string json_write;
    base::JSONWriter::Write(&root, false, &json_write);
    Value* json_read = base::JSONReader::Read(json_write, false);
    delete json_read;

    Tuple3<int, double, bool> t3 = MakeTuple(10, 2.5, false);

    ObjClass obj;
    Callback0::Type* callback = NewCallback(&obj, &ObjClass::Bar);
    callback->Run();
    delete callback;

    thred.Start();
    thred.message_loop()->PostDelayedTask(new PrintTask(), 1000);

    MessageLoop msg_loop;
    msg_loop.PostDelayedTask(new MainThreadPrintTask(), 3000);
    msg_loop.Run();

    thred.Stop();

    return 0;
}
Пример #18
0
BaseClientWrapper::BaseClientWrapper()
  : m_close_callback(NewCallback(&m_ss, &ola::io::SelectServer::Terminate)) {
}
Пример #19
0
int
NsTclSchedDailyCmd(ClientData arg, Tcl_Interp *interp, int argc, char **argv)
{
    TclCallback *cbPtr;
    int          flags;
    int          first;
    int          id;
    int          hour, minute;

    /* 12 cases (arg count & number after cmd and -options are handled):
     *      0    1        2        3         4         5          6
     *   * cmd hour     minute   script                              (4 args)/3
     *   * cmd hour     minute   procname                            (4 args)/3
     *   * cmd hour     minute   procname  arg                       (5 args)/4
     *   * cmd -once    hour     minute    script                    (5 args)/3
     *   * cmd -once    hour     minute    procname                  (5 args)/3
     *   * cmd -once    hour     minute    procname  arg             (6 args)/4
     *   * cmd -thread  hour     minute    script                    (5 args)/3
     *   * cmd -thread  hour     minute    procname                  (5 args)/3
     *   * cmd -thread  hour     minute    procname  arg             (6 args)/4
     *   * cmd -once    -thread  hour      minute    script          (6 args)/3
     *   * cmd -once    -thread  hour      minute    procname        (6 args)/3
     *   * cmd -once    -thread  hour      minute    procname  arg   (7 args)/4
     */

    first = 1;
    flags = 0;

    while (argc-- && argv[first] != NULL) {
        if (strcmp(argv[first], "-thread") == 0) {
            flags |= NS_SCHED_THREAD;
        } else if (strcmp(argv[first], "-once") == 0) {
            flags |= NS_SCHED_ONCE;
        } else {
	    break;
        }
	first++;
    }

    if (argc < 3 || argc > 4) {
        Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
			 " ?-once? ?-thread? hour minute "
			 "{ script | procname ?arg? }\"", (char *) NULL);
        return TCL_ERROR;
    }


    /*
     * First is now the first argument that is not a switch.
     */

    if (Tcl_GetInt(interp, argv[first++], &hour) != TCL_OK) {
        return TCL_ERROR;
    }
    if (hour < 0 || hour > 23) {
        Tcl_AppendResult(interp, "invalid hour \"", argv[first - 1],
			 "\": should be >= 0 and <= 23", NULL);
        return TCL_ERROR;
    }

    if (Tcl_GetInt(interp, argv[first++], &minute) != TCL_OK) {
        return TCL_ERROR;
    }
    if (minute < 0 || minute > 59) {
        Tcl_AppendResult(interp, "invalid minute \"", argv[first - 1],
			 "\": should be >= 0 and <= 59", NULL);
        return TCL_ERROR;
    }

    /*
     * Bear in mind that argc has been changed when counting switches,
     * so assume that there are no switches when reading the 4 here.
     */

    cbPtr = NewCallback(interp, argv[first], argv[first+1]);
    id = Ns_ScheduleDaily(NsTclSchedProc, cbPtr, flags,
			  hour, minute, FreeSched);
    return ReturnValidId(interp, id, cbPtr);
}