* limitations under the License.
*/
-#include <ServiceProxy.h>
+#include <algorithm>
#include <JobSchedulerTypesPrivate.h>
#include <job_scheduler_internal.h>
#include <JobInfo.h>
#include <JobContext.h>
#include <JobAction.h>
#include <Attribute.h>
+#include "JobManagerProxy.h"
#define ASSERT_ALLOC(PTR) IF_FAIL_RETURN_TAG((PTR), E_NO_MEM, _E, E_STR_ALLOC)
using namespace ctx;
+
typedef struct _ctx_sched_s {
- ServiceProxy proxy; //FIXME
- _ctx_sched_s() : proxy(CTX_JOB_SCHEDULER) {}
+ JobManagerProxy jobManager;
+ ctx_sched_stop_job_cb stopJobCb;
+ void* userData;
+
+ _ctx_sched_s() :
+ stopJobCb(NULL), userData(NULL) {}
} ctx_sched_s;
+
typedef struct _ctx_sched_job_s {
- int jobId;
- bool started;
JobInfo* jobInfo;
- _ctx_sched_job_s() : jobId(-1), started(false), jobInfo(NULL) {}
- ~_ctx_sched_job_s() { delete jobInfo; }
+
+ _ctx_sched_job_s() :
+ jobInfo(NULL) {}
+
+ ~_ctx_sched_job_s()
+ {
+ delete jobInfo;
+ }
} ctx_sched_job_s;
+
typedef struct _ctx_sched_job_context_s {
JobContext* jobContext;
- _ctx_sched_job_context_s() : jobContext(NULL) {}
- ~_ctx_sched_job_context_s() { delete jobContext; }
+
+ _ctx_sched_job_context_s() :
+ jobContext(NULL) {}
+
+ ~_ctx_sched_job_context_s()
+ {
+ delete jobContext;
+ }
} ctx_sched_job_context_s;
ASSERT_ALLOC(sched);
*scheduler = sched;
+
return E_NONE;
}
EXPORT_API int ctx_sched_destroy(ctx_sched_h scheduler)
{
IF_FAIL_RETURN(scheduler, E_PARAM);
+
delete scheduler;
+
return E_NONE;
}
}
*job_id = jid;
+
return E_NONE;
}
static bool __cancelJob(ctx_sched_h scheduler, ctx_sched_job_h job, void* user_data)
{
int jid = -1;
+
ctx_sched_job_get_id(job, &jid);
ctx_sched_cancel(scheduler, jid);
ctx_sched_job_destroy(job);
+
return true;
}
{
IF_FAIL_RETURN(scheduler && job && job_id, E_PARAM);
- //TODO
- return E_SUPPORT;
+ int jid = scheduler->jobManager.addJob(job->jobInfo);
+ IF_FAIL_RETURN(jid > 0, jid);
+
+ *job_id = jid;
+ job->jobInfo->setId(jid);
+
+ return E_NONE;
}
EXPORT_API int ctx_sched_start_job(ctx_sched_h scheduler, int job_id)
{
IF_FAIL_RETURN(scheduler && job_id > 0, E_PARAM);
- //TODO
- return E_SUPPORT;
+ return scheduler->jobManager.startJob(job_id);
}
EXPORT_API int ctx_sched_stop_job(ctx_sched_h scheduler, int job_id)
{
IF_FAIL_RETURN(scheduler && job_id > 0, E_PARAM);
- //TODO
- return E_SUPPORT;
+ return scheduler->jobManager.stopJob(job_id);
}
EXPORT_API int ctx_sched_remove_job(ctx_sched_h scheduler, int job_id)
{
IF_FAIL_RETURN(scheduler && job_id > 0, E_PARAM);
- //TODO
- return E_SUPPORT;
+ return scheduler->jobManager.removeJob(job_id);
}
EXPORT_API int ctx_sched_get_job(ctx_sched_h scheduler, int job_id, ctx_sched_job_h* job)
{
IF_FAIL_RETURN(scheduler && job_id > 0 && job, E_PARAM);
- //TODO
- return E_SUPPORT;
+ ctx_sched_job_s* jobHandle = new(std::nothrow) ctx_sched_job_s();
+ ASSERT_ALLOC(jobHandle);
+
+ try {
+ jobHandle->jobInfo = scheduler->jobManager.getJob(job_id);
+ } catch (const int err) {
+ delete jobHandle;
+ return err;
+ }
+
+ return E_NONE;
}
EXPORT_API int ctx_sched_foreach_job(ctx_sched_h scheduler, ctx_sched_foreach_job_cb callback, void* user_data)
{
IF_FAIL_RETURN(scheduler && callback, E_PARAM);
- //TODO
- return E_SUPPORT;
+ std::vector<JobInfo*> jobInfos;
+
+ try {
+ jobInfos = scheduler->jobManager.getAllJob();
+ } catch (const int err) {
+ return err;
+ }
+
+ for (auto& jobInfo : jobInfos) {
+ ctx_sched_job_s* jobHandle = new(std::nothrow) ctx_sched_job_s();
+ if (jobHandle == NULL) {
+ _E_ALLOC;
+ std::for_each(jobInfos.begin(), jobInfos.end(), [](JobInfo*& j){ delete j; });
+ return E_NO_MEM;
+ }
+
+ jobHandle->jobInfo = jobInfo;
+ jobInfo = NULL;
+
+ if (!callback(scheduler, jobHandle, user_data)) {
+ std::for_each(jobInfos.begin(), jobInfos.end(), [](JobInfo*& j){ delete j; });
+ break;
+ }
+ }
+
+ return E_NONE;
+}
+
+static void __stopJob(JobInfo* jobInfo, void* userData)
+{
+ ctx_sched_s* scheduler = static_cast<ctx_sched_s*>(userData);
+ ctx_sched_job_s* job = new(std::nothrow) ctx_sched_job_s();
+ IF_FAIL_VOID_TAG(job, _E, E_STR_ALLOC);
+
+ job->jobInfo = jobInfo;
+ scheduler->stopJobCb(scheduler, job, scheduler->userData);
}
EXPORT_API int ctx_sched_set_stop_job_cb(ctx_sched_h scheduler, ctx_sched_stop_job_cb callback, void* user_data)
{
IF_FAIL_RETURN(scheduler && callback, E_PARAM);
- //TODO
- return E_SUPPORT;
+ scheduler->stopJobCb = callback;
+ scheduler->userData = user_data;
+ scheduler->jobManager.setStopJobCb(__stopJob, scheduler);
+
+ return E_NONE;
}
EXPORT_API int ctx_sched_job_create_periodic(unsigned int interval, time_t anchor, ctx_sched_job_h* job)
}
*job = _job;
+
return E_NONE;
}
}
*job = _job;
+
return E_NONE;
}
IF_FAIL_RETURN(job, E_PARAM);
delete job;
+
return E_NONE;
}
IF_FAIL_RETURN(trigger->jobContext->getType() == JobContext::Type::TRIGGER, E_PARAM);
static_cast<OnDemandJobInfo*>(job->jobInfo)->addTrigger(static_cast<JobTrigger*>(trigger->jobContext));
+
return E_NONE;
}
IF_FAIL_RETURN(requirement->jobContext->getType() == JobContext::Type::REQUIREMENT, E_PARAM);
job->jobInfo->addRequirement(static_cast<JobRequirement*>(requirement->jobContext));
+
return E_NONE;
}
IF_FAIL_RETURN(job, E_PARAM);
job->jobInfo->setRequirementTimeout(timeout);
+
return E_NONE;
}
IF_FAIL_RETURN(job, E_PARAM);
job->jobInfo->setPersistent(persistent);
+
return E_NONE;
}
IF_FAIL_RETURN(job, E_PARAM);
job->jobInfo->setOneTime(one_time);
+
return E_NONE;
}
ASSERT_ALLOC(action);
job->jobInfo->setAction(action);
+
return E_NONE;
}
ASSERT_ALLOC(action);
job->jobInfo->setAction(action);
+
return E_NONE;
}
IF_FAIL_RETURN(job && user_data, E_PARAM);
job->jobInfo->setUserData(user_data);
+
return E_NONE;
}
{
IF_FAIL_RETURN(job && started, E_PARAM);
- *started = job->started;
+ *started = job->jobInfo->isStarted();
+
return E_NONE;
}
{
IF_FAIL_RETURN(job && job_id, E_PARAM);
- *job_id = job->jobId;
+ *job_id = job->jobInfo->getId();
+
return E_NONE;
}
IF_FAIL_RETURN(job && user_data, E_PARAM);
*user_data = job->jobInfo->getUserData().c_str();
+
return E_NONE;
}
-EXPORT_API int ctx_sched_job_trigger_is_supported(const char* uri, bool* supported)
+EXPORT_API int ctx_sched_job_trigger_is_supported(ctx_sched_h scheduler, const char* uri, bool* supported)
{
- IF_FAIL_RETURN(uri && supported, E_PARAM);
+ IF_FAIL_RETURN(scheduler && uri && supported, E_PARAM);
+
+ try {
+ *supported = scheduler->jobManager.isAvailableTrigger(uri);
+ } catch (const int& err) {
+ return err;
+ }
- //TODO
return E_NONE;
}
{
IF_FAIL_RETURN(uri && job_context, E_PARAM);
- bool supported = false;
- ctx_sched_job_trigger_is_supported(uri, &supported);
- IF_FAIL_RETURN(supported, E_SUPPORT);
-
ctx_sched_job_context_s* jobCtxHandle = new(std::nothrow) ctx_sched_job_context_s();
ASSERT_ALLOC(jobCtxHandle);
}
*job_context = jobCtxHandle;
+
return E_NONE;
}
-EXPORT_API int ctx_sched_job_requirement_is_supported(const char* uri, bool* supported)
+EXPORT_API int ctx_sched_job_requirement_is_supported(ctx_sched_h scheduler, const char* uri, bool* supported)
{
- IF_FAIL_RETURN(uri && supported, E_PARAM);
+ IF_FAIL_RETURN(scheduler && uri && supported, E_PARAM);
- //TODO
- return E_SUPPORT;
+ try {
+ *supported = scheduler->jobManager.isAvailableRequirement(uri);
+ } catch (const int& err) {
+ return err;
+ }
+
+ return E_NONE;
}
EXPORT_API int ctx_sched_job_requirement_create(const char* uri, bool optional, ctx_sched_job_context_h* job_context)
{
IF_FAIL_RETURN(uri && job_context, E_PARAM);
- bool supported = false;
- ctx_sched_job_requirement_is_supported(uri, &supported);
- IF_FAIL_RETURN(supported, E_SUPPORT);
-
ctx_sched_job_context_s* jobCtxHandle = new(std::nothrow) ctx_sched_job_context_s();
ASSERT_ALLOC(jobCtxHandle);
}
*job_context = jobCtxHandle;
+
return E_NONE;
}
IF_FAIL_RETURN(job_context && name, E_PARAM);
bool ret = job_context->jobContext->prepareAttributeInt(name);
+
return ret ? E_NONE : E_PARAM;
}
IF_FAIL_RETURN(job_context && name, E_PARAM);
bool ret = job_context->jobContext->prepareAttributeStr(name);
+
return ret ? E_NONE : E_PARAM;
}
IF_FAIL_RETURN(attr->getType() == Attribute::Type::INTEGER, E_PARAM);
static_cast<IntegerAttribute*>(attr)->addTarget(value);
+
return E_NONE;
}
IF_FAIL_RETURN(attr->getType() == Attribute::Type::STRING, E_PARAM);
static_cast<StringAttribute*>(attr)->addTarget(value);
+
return E_NONE;
}
IF_FAIL_RETURN(attr->getType() == Attribute::Type::INTEGER, E_PARAM);
static_cast<IntegerAttribute*>(attr)->addNonTarget(value);
+
return E_NONE;
}
IF_FAIL_RETURN(attr->getType() == Attribute::Type::STRING, E_PARAM);
static_cast<StringAttribute*>(attr)->addNonTarget(value);
+
return E_NONE;
}
IF_FAIL_RETURN(attr->getType() == Attribute::Type::INTEGER, E_PARAM);
static_cast<IntegerAttribute*>(attr)->setOpenLowerBound(value);
+
return E_NONE;
}
IF_FAIL_RETURN(attr->getType() == Attribute::Type::INTEGER, E_PARAM);
static_cast<IntegerAttribute*>(attr)->setClosedLowerBound(value);
+
return E_NONE;
}
IF_FAIL_RETURN(attr->getType() == Attribute::Type::INTEGER, E_PARAM);
static_cast<IntegerAttribute*>(attr)->setOpenUpperBound(value);
+
return E_NONE;
}
IF_FAIL_RETURN(attr->getType() == Attribute::Type::INTEGER, E_PARAM);
static_cast<IntegerAttribute*>(attr)->setClosedUpperBound(value);
+
return E_NONE;
}
IF_FAIL_RETURN(job_context, E_PARAM);
delete job_context;
+
return E_NONE;
}
IF_FAIL_RETURN(job_context, E_PARAM);
job_context->jobContext->setDisjunction(disjunction);
+
return E_NONE;
}