1/* 2 * Copyright 2011-2015, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Oliver Tappe <zooey@hirschkaefer.de> 7 */ 8 9 10#include <package/Request.h> 11 12#include <new> 13 14#include <JobQueue.h> 15 16#include <package/Context.h> 17 18 19namespace BPackageKit { 20 21 22using BSupportKit::BPrivate::JobQueue; 23 24 25BRequest::BRequest(const BContext& context) 26 : 27 fContext(context), 28 fJobQueue(new (std::nothrow) JobQueue()) 29{ 30 fInitStatus = fJobQueue == NULL ? B_NO_MEMORY : B_OK; 31} 32 33 34BRequest::~BRequest() 35{ 36} 37 38 39status_t 40BRequest::InitCheck() const 41{ 42 return fInitStatus; 43} 44 45 46BSupportKit::BJob* 47BRequest::PopRunnableJob() 48{ 49 if (fJobQueue == NULL) 50 return NULL; 51 52 return fJobQueue->Pop(); 53} 54 55 56status_t 57BRequest::Process(bool failIfCanceledOnly) 58{ 59 status_t error = InitCheck(); 60 if (error != B_OK) 61 return error; 62 63 error = CreateInitialJobs(); 64 if (error != B_OK) 65 return error; 66 67 while (BSupportKit::BJob* job = PopRunnableJob()) { 68 error = job->Run(); 69 delete job; 70 if (error != B_OK) { 71 if (!failIfCanceledOnly || error == B_CANCELED) 72 return error; 73 } 74 } 75 76 return B_OK; 77} 78 79 80status_t 81BRequest::QueueJob(BSupportKit::BJob* job) 82{ 83 if (fJobQueue == NULL) 84 return B_NO_INIT; 85 86 job->AddStateListener(this); 87 job->AddStateListener(&fContext.JobStateListener()); 88 89 return fJobQueue->AddJob(job); 90} 91 92 93} // namespace BPackageKit 94