diff --git a/src/framework/core/event.cpp b/src/framework/core/event.cpp new file mode 100644 index 00000000..f607c893 --- /dev/null +++ b/src/framework/core/event.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2010-2012 OTClient + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "event.h" + +Event::Event(const std::function& callback) : + m_callback(callback), + m_canceled(false), + m_executed(false) +{ +} + +Event::~Event() +{ + // assure that we lost callback refs + //assert(m_callback == nullptr); +} + +void Event::execute() +{ + if(!m_canceled && !m_executed && m_callback) { + m_callback(); + m_executed = true; + } + + // reset callback to free object refs + m_callback = nullptr; +} + +void Event::cancel() +{ + m_canceled = true; + m_callback = nullptr; +} diff --git a/src/framework/core/event.h b/src/framework/core/event.h new file mode 100644 index 00000000..906274ba --- /dev/null +++ b/src/framework/core/event.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2010-2012 OTClient + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef EVENT_H +#define EVENT_H + +#include + +// @bindclass +class Event : public LuaObject +{ +public: + Event(const std::function& callback); + virtual ~Event(); + + virtual void execute(); + void cancel(); + + bool isCanceled() { return m_canceled; } + bool isExecuted() { return m_executed; } + +protected: + std::function m_callback; + bool m_canceled; + bool m_executed; +}; + +#endif diff --git a/src/framework/core/scheduledevent.cpp b/src/framework/core/scheduledevent.cpp new file mode 100644 index 00000000..8ef33c7c --- /dev/null +++ b/src/framework/core/scheduledevent.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2010-2012 OTClient + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "scheduledevent.h" + +ScheduledEvent::ScheduledEvent(const std::function& callback, int delay, int maxCycles) : Event(callback) +{ + m_ticks = g_clock.millis() + delay; + m_delay = delay; + m_maxCycles = maxCycles; + m_cyclesExecuted = 0; +} + +void ScheduledEvent::execute() +{ + if(!m_canceled && m_callback && (m_maxCycles == 0 || m_cyclesExecuted < m_maxCycles)) { + m_callback(); + m_executed = true; + // callback may be used in the next cycle + } else { + // reset callback to free object refs + m_callback = nullptr; + } + + m_cyclesExecuted++; +} + +bool ScheduledEvent::nextCycle() +{ + if(m_callback && !m_canceled && (m_maxCycles == 0 || m_cyclesExecuted < m_maxCycles)) { + m_ticks += m_delay; + return true; + } + + // reset callback to free object refs + m_callback = nullptr; + return false; +} diff --git a/src/framework/core/scheduledevent.h b/src/framework/core/scheduledevent.h new file mode 100644 index 00000000..a7fd524f --- /dev/null +++ b/src/framework/core/scheduledevent.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2010-2012 OTClient + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef SCHEDULEDEVENT_H +#define SCHEDULEDEVENT_H + +#include "event.h" +#include "clock.h" + +// @bindclass +class ScheduledEvent : public Event +{ +public: + ScheduledEvent(const std::function& callback, int delay, int maxCycles); + void execute(); + bool nextCycle(); + + int ticks() { return m_ticks; } + int reamaningTicks() { return m_ticks - g_clock.millis(); } + int delay() { return m_delay; } + int cyclesExecuted() { return m_cyclesExecuted; } + int maxCycles() { return m_maxCycles; } + +private: + ticks_t m_ticks; + int m_delay; + int m_maxCycles; + int m_cyclesExecuted; +}; + +struct lessScheduledEvent : std::binary_function { + bool operator()(const ScheduledEventPtr& a, const ScheduledEventPtr& b) { + return b->ticks() < a->ticks(); + } +}; + +#endif