2 * Copyright (c) 2013, TOYOTA MOTOR CORPORATION.
4 * This program is licensed under the terms and conditions of the
5 * Apache License, version 2.0. The full text of the Apache License is at
6 * http://www.apache.org/licenses/LICENSE-2.0
10 //==========================================================================
12 * @file CicoSCResourceManager.cpp
14 * @brief This file implementation of CicoSCResourceManager class
16 //==========================================================================
21 #include "CicoSCResourceManager.h"
23 #include "ico_syc_error.h"
24 #include "ico_syc_mrp_resource_private.h"
26 #include "ico_syc_msg_cmd_def.h"
27 #include "CicoSCSystemConfig.h"
28 #include "CicoSCConf.h"
29 #include "CicoSCCommand.h"
30 #include "CicoSCPolicyManager.h"
31 #include "CicoSCLifeCycleController.h"
32 #include "CicoSCAilItems.h"
33 #include "CicoSCWindowController.h"
34 #include "CicoSCInputController.h"
35 #include "CicoSCPolicyDef.h"
37 struct CompDisplayResourceRequest
39 CompDisplayResourceRequest(const resource_request_t *req)
42 bool operator() (const resource_request_t *req)
47 ICO_DBG("appid=%s:%s", req->appid, m_req->appid);
48 if ((0 == strcmp(m_req->appid, req->appid)) &&
49 (m_req->pid == req->pid) &&
50 ((m_req->resid & RESID_TYPE_MASK) == (req->resid & RESID_TYPE_MASK)) &&
51 (m_req->surfaceid == req->surfaceid)) {
57 const resource_request_t *m_req;
60 struct CompSoundResourceRequest
62 CompSoundResourceRequest(const resource_request_t *req)
65 bool operator() (const resource_request_t *req)
71 ICO_DBG("appid=%s:%s", req->appid, m_req->appid);
72 if ((0 == strcmp(m_req->appid, req->appid)) &&
73 (m_req->pid == req->pid) &&
74 ((m_req->resid & RESID_TYPE_MASK) == (req->resid & RESID_TYPE_MASK)) &&
75 (m_req->soundid == req->soundid)) {
81 const resource_request_t *m_req;
84 struct CompInputResourceRequest
86 CompInputResourceRequest(const resource_request_t *req)
89 bool operator() (const resource_request_t *req)
95 ICO_DBG("appid=%s:%s", req->appid, m_req->appid);
96 if ((0 == strcmp(m_req->appid, req->appid)) &&
97 (0 == strcmp(m_req->device, req->device)) &&
98 (m_req->pid == req->pid) &&
99 ((m_req->resid & RESID_TYPE_MASK) == (req->resid & RESID_TYPE_MASK))) {
105 const resource_request_t *m_req;
109 CicoSCResourceManager::CicoSCResourceManager()
110 : m_winCtrl(NULL), m_inputCtrl(NULL)
112 m_policyMgr = new CicoSCPolicyManager(this);
114 CicoSCSystemConfig *sysConf = CicoSCSystemConfig::getInstance();
115 list<resource_request_t*> l;
118 // initialize display current request and waiting queue
119 const vector<CicoSCDisplayConf*>& dispConfList
120 = sysConf->getDisplayConfList();
121 vector<CicoSCDisplayConf*>::const_iterator itr;
122 itr = dispConfList.begin();
123 for (; itr != dispConfList.end(); ++itr) {
124 vector<CicoSCDisplayZoneConf*>::iterator itr2;
125 itr2 = (*itr)->zoneConfList.begin();
126 for (; itr2 != (*itr)->zoneConfList.end(); ++itr2) {
127 m_curDispResOwerReq[(*itr2)->id] = NULL;
133 // initialize sound current request and waiting queue
134 const vector<CicoSCSoundConf*>& soundConfList
135 = sysConf->getSoundConfList();
136 vector<CicoSCSoundConf*>::const_iterator itr;
137 itr = soundConfList.begin();
138 for (; itr != soundConfList.end(); ++itr) {
139 vector<CicoSCSoundZoneConf*>::iterator itr2;
140 itr2 = (*itr)->zoneConfList.begin();
141 for (; itr2 != (*itr)->zoneConfList.end(); ++itr2) {
142 m_curSoundResReq[(*itr2)->id] = NULL;
143 m_soundReqQueue[(*itr2)->id] = l;
149 // initialize input current request and waiting queue
150 const vector<CicoSCInputDevConf*>& inputDevConfList
151 = sysConf->getInputDevConfList();
152 vector<CicoSCInputDevConf*>::const_iterator itr;
153 itr = inputDevConfList.begin();
154 for (; itr != inputDevConfList.end(); ++itr) {
155 vector<CicoSCSwitchConf*>::iterator itr2;
156 itr2 = (*itr)->switchConfList.begin();
157 for (; itr2 != (*itr)->switchConfList.end(); ++itr2) {
158 m_curInputResReq[(*itr2)->id] = NULL;
159 m_inputReqQueue[(*itr2)->id] = l;
165 CicoSCResourceManager::~CicoSCResourceManager()
171 CicoSCResourceManager::initialize(void)
173 ICO_DBG("CicoSCResourceManager::initialize Enter");
175 int ret = ICO_SYC_EOK;
177 ret = ico_syc_mrp_init(enforceSound, this);
178 if (ICO_SYC_EOK != ret) {
182 ret = m_policyMgr->initialize();
183 if (ICO_SYC_EOK != ret) {
188 ICO_DBG("CicoSCResourceManager::initialize Leave");
193 CicoSCResourceManager::terminate(void)
195 ICO_DBG("CicoSCResourceManager::terminate Enter");
196 m_policyMgr->terminate();
197 ICO_DBG("CicoSCResourceManager::terminate Leave");
201 CicoSCResourceManager::handleCommand(const CicoSCCommand &cmd,
204 ICO_DBG("CicoSCResourceManager::handleCommand Enter"
205 "(cmdid=0x%08X internal=%s)",
206 cmd.cmdid, internal ? "true" : "false");
208 CicoSCCmdResCtrlOpt *opt = (CicoSCCmdResCtrlOpt*)cmd.opt;
210 // request command from application or internal
211 int reqtype = internal ? REQTYPE_AUTO : REQTYPE_APP;
213 if ((MSG_CMD_CREATE_RES == cmd.cmdid) ||
214 (MSG_CMD_ACQUIRE_RES == cmd.cmdid)) {
216 if (true == opt->dispres) {
217 resource_request_t *req = newResourceRequest(RESID_KIND_DISPLAY,
220 if (MSG_CMD_CREATE_RES == cmd.cmdid) {
221 acquireDisplayResource(req, false);
224 acquireDisplayResource(req);
228 if (true == opt->soundres) {
229 resource_request_t *req = newResourceRequest(RESID_KIND_SOUND,
232 acquireSoundResource(req);
234 if (true == opt->inputres) {
235 resource_request_t *req = newResourceRequest(RESID_KIND_INPUT,
238 acquireInputResource(req);
241 else if ((MSG_CMD_RELEASE_RES == cmd.cmdid) ||
242 (MSG_CMD_DESTORY_RES == cmd.cmdid)) {
244 if (true == opt->dispres) {
245 resource_request_t *req = newResourceRequest(RESID_KIND_DISPLAY,
248 releaseDisplayResource(req);
250 if (true == opt->soundres) {
251 resource_request_t *req = newResourceRequest(RESID_KIND_SOUND,
254 releaseSoundResource(req);
256 if (true == opt->inputres) {
257 resource_request_t *req = newResourceRequest(RESID_KIND_INPUT,
260 releaseInputResource(req);
264 ICO_WRN("Unknown command");
267 ICO_DBG("CicoSCResourceManager::handleCommand Leave");
271 CicoSCResourceManager::setWindowController(CicoSCWindowController *winCtrl)
277 CicoSCResourceManager::setInputController(CicoSCInputController *inputCtrl)
279 m_inputCtrl = inputCtrl;
284 CicoSCResourceManager::popDispResReq(resource_request_t *req)
286 ICO_DBG("CicoSCResourceManager::popDispResReq Enter");
288 map<int, list<resource_request_t*> >::iterator itr;
289 itr = m_dispReqQueue.begin();
290 CompDisplayResourceRequest comp(req);
291 for (; itr != m_dispReqQueue.end(); ++itr) {
292 list<resource_request_t*>::iterator itr2;
293 itr2 = find_if(itr->second.begin(), itr->second.end(), comp);
294 if (itr->second.end() != itr2) {
295 ICO_DBG("Dequeue waiting display request queue zone=%d req=0x%08x",
297 m_dispReqQueue[req->dispzoneid].erase(itr2);
298 ICO_DBG("CicoSCResourceManager::popDispResReq Leave"
304 ICO_DBG("CicoSCResourceManager::popDispResReq Leave(NULL)");
310 CicoSCResourceManager::popSoundResReq(resource_request_t *req)
312 ICO_DBG("CicoSCResourceManager::popSoundResReq Enter");
314 map<int, list<resource_request_t*> >::iterator itr;
315 itr = m_soundReqQueue.begin();
316 CompSoundResourceRequest comp(req);
317 for (; itr != m_soundReqQueue.end(); ++itr) {
318 list<resource_request_t*>::iterator itr2;
319 itr2 = find_if(itr->second.begin(), itr->second.end(), comp);
320 if (itr->second.end() != itr2) {
321 ICO_DBG("Dequeue waiting sound request queue zone=%d req=0x%08x",
323 m_soundReqQueue[req->soundzoneid].erase(itr2);
324 ICO_DBG("CicoSCResourceManager::popSoundResReq Leave"
329 ICO_DBG("CicoSCResourceManager::popSoundResReq Leave(NULL)");
334 CicoSCResourceManager::popInputResReq(resource_request_t *req)
336 ICO_DBG("CicoSCResourceManager::popInputResReq Enter");
338 map<int, list<resource_request_t*> >::iterator itr;
339 itr = m_inputReqQueue.begin();
340 CompInputResourceRequest comp(req);
341 for (; itr != m_inputReqQueue.end(); ++itr) {
342 list<resource_request_t*>::iterator itr2;
343 itr2 = find_if(itr->second.begin(), itr->second.end(), comp);
344 if (itr->second.end() != itr2) {
345 ICO_DBG("Dequeue waiting input request queue input=%d req=0x%08x",
347 m_inputReqQueue[req->input].erase(itr2);
348 ICO_DBG("CicoSCResourceManager::popInputResReq Leave"
354 ICO_DBG("CicoSCResourceManager::popDispResReq Leave(NULL)");
360 CicoSCResourceManager::acquireDisplayResource(resource_request_t *newreq,
363 ICO_DBG("CicoSCResourceManager::acquireDisplayResource Enter");
365 CicoSCSystemConfig *sysConf = CicoSCSystemConfig::getInstance();
366 const CicoSCAppKindConf *appKindConf = NULL;
367 appKindConf = sysConf->findAppKindConfbyId(newreq->appkind);
368 if (NULL == appKindConf) {
369 ICO_ERR("not found CicoSCAppKindConf instance");
370 ICO_DBG("CicoSCResourceManager::acquireDisplayResource Leave(false)");
374 if ((appKindConf->privilege == CicoSCAppKindConf::PRIVILEGE_ALMIGHTY) ||
375 (appKindConf->privilege == CicoSCAppKindConf::PRIVILEGE_SYSTEM) ||
376 (appKindConf->privilege == CicoSCAppKindConf::PRIVILEGE_SYSTEM_VISIBLE)) {
378 if ((NULL != m_winCtrl) && (true == control)) {
379 m_winCtrl->show(newreq->surfaceid,
381 newreq->animationTime);
383 delResourceRequest(newreq);
385 ICO_DBG("kind of system application");
386 ICO_DBG("CicoSCResourceManager::acquireDisplayResource Leave(true)");
390 // if exist current ower request, pop request
391 resource_request_t *req = findCurDispResOwerReq(newreq);
394 ICO_DBG("dispzoneid=%d/%d zone=%s/%s",
395 req->dispzoneid, newreq->dispzoneid,
396 req->dispzone, newreq->dispzone);
397 if (req->dispzoneid != newreq->dispzoneid) {
398 req = popCurDispResOwerReq(req);
399 chgzone = newreq->dispzoneid;
403 // if exist in wating request list, pop request
405 req = popWaitingDispResReq(newreq);
407 ICO_DBG("dispzoneid=%d/%d zone=%s/%s",
408 req->dispzoneid, newreq->dispzoneid,
409 req->dispzone, newreq->dispzone);
410 if (req->dispzoneid != newreq->dispzoneid) {
411 chgzone = newreq->dispzoneid;
421 // update request data
422 req->dispzoneid = newreq->dispzoneid;
423 if (NULL != req->dispzone) free(req->dispzone);
424 req->dispzone = strdup(newreq->dispzone);
425 if (NULL != req->animation) free(req->animation);
426 req->animation = strdup(newreq->animation);
427 req->animationTime = newreq->animationTime;
429 // delete new request
430 delResourceRequest(newreq);
433 if (false == control) {
434 ICO_DBG("Enqueue waiting display resource request"
435 "(req=0x%08x appid=%s)", req, req->appid);
436 m_waitingDispResReq.push_front(req);
438 dumpWaitingDispResReq();
443 int type = req->resid & RESID_TYPE_MASK;
444 bool state = m_policyMgr->acquireDisplayResource(type,
448 updateDisplayResource(req, chgzone);
451 ICO_DBG("Enqueue waiting display resource request"
452 "(req=0x%08x appid=%s)", req, req->appid);
453 m_waitingDispResReq.push_front(req);
455 dumpWaitingDispResReq();
460 ICO_DBG("CicoSCResourceManager::acquireDisplayResource Leave");
465 CicoSCResourceManager::releaseDisplayResource(resource_request_t *newreq)
467 ICO_DBG("CicoSCResourceManager::releaseDisplayResource Enter"
468 "(newreq=0x%08x)", newreq);
470 // if exist in wating request list, pop request
471 resource_request_t *req = popWaitingDispResReq(newreq);
473 delResourceRequest(req);
474 delResourceRequest(newreq);
475 ICO_DBG("CicoSCResourceManager::releaseDisplayResource Leave");
479 // if exist current ower request, pop request
480 req = popCurDispResOwerReq(newreq);
482 delResourceRequest(req);
484 delResourceRequest(newreq);
486 list<resource_request_t*>::iterator itr;
487 itr = m_waitingDispResReq.begin();
488 for (; itr != m_waitingDispResReq.end(); ++itr) {
489 int type = (*itr)->resid & RESID_TYPE_MASK;
490 bool active = m_policyMgr->acquireDisplayResource(type,
493 if (true == active) {
494 resource_request_t* popreq = popWaitingDispResReq(*itr);
495 updateDisplayResource(popreq);
496 m_winCtrl->active(popreq->surfaceid, -1);
501 ICO_DBG("CicoSCResourceManager::releaseDisplayResource Leave");
505 CicoSCResourceManager::acquireSoundResource(resource_request_t *newreq)
507 ICO_DBG("CicoSCResourceManager::acquireSoundResource Enter");
509 CicoSCSystemConfig *sysConf = CicoSCSystemConfig::getInstance();
510 const CicoSCAppKindConf *appKindConf = NULL;
511 appKindConf = sysConf->findAppKindConfbyId(newreq->appkind);
512 if (NULL == appKindConf) {
513 ICO_ERR("not found CicoSCAppKindConf instance");
514 ICO_DBG("CicoSCResourceManager::acquireSoundResource Leave(false)");
518 if ((appKindConf->privilege == CicoSCAppKindConf::PRIVILEGE_ALMIGHTY) ||
519 (appKindConf->privilege == CicoSCAppKindConf::PRIVILEGE_SYSTEM) ||
520 (appKindConf->privilege == CicoSCAppKindConf::PRIVILEGE_SYSTEM_AUDIO)) {
522 delResourceRequest(newreq);
524 ICO_DBG("kind of system application");
525 ICO_DBG("CicoSCResourceManager::acquireSoundResource Leave(true)");
529 resource_request_t *req = popSoundResReq(newreq);
535 CompSoundResourceRequest comp(req);
536 if (true == comp(m_curSoundResReq[req->soundzoneid])) {
537 ICO_DBG("already acquired appid=%s pid=%d soundid=0x%08X",
538 req->appid, req->pid, req->soundid);
539 ICO_DBG("CicoSCResourceManager::acquireSoundResource Leave(true)");
541 delResourceRequest(newreq);
545 int type = req->resid & RESID_TYPE_MASK;
546 bool state = m_policyMgr->acquireSoundResource(type,
550 updateSoundResource(req);
553 ICO_DBG("Enqueue waiting sound request queue zone=%d req=0x%08x",
554 req->soundzoneid, req);
555 m_soundReqQueue[req->soundzoneid].push_front(req);
558 ICO_DBG("CicoSCResourceManager::acquireSoundResource Leave");
563 CicoSCResourceManager::releaseSoundResource(resource_request_t *newreq)
565 ICO_DBG("CicoSCResourceManager::releaseSoundResource Enter");
568 CompSoundResourceRequest comp(newreq);
569 for (int i = 0; i < (int)m_curSoundResReq.size(); ++i) {
570 if (NULL == m_curSoundResReq[i]) {
574 if (true == comp(m_curSoundResReq[i])) {
575 ico_syc_mrp_release_sound_resource(m_curSoundResReq[i]);
576 delResourceRequest(newreq);
577 delResourceRequest(m_curSoundResReq[i]);
578 m_curSoundResReq[i] = NULL;
584 // If current request is not changed,
585 // remove the request from the waiting queue.
586 if (false == curchg) {
587 resource_request_t *req = popSoundResReq(newreq);
589 ico_syc_mrp_release_sound_resource(req);
590 delResourceRequest(req);
593 delResourceRequest(newreq);
594 ICO_DBG("CicoSCResourceManager::releaseSoundResource Leave");
598 map<int, list<resource_request_t*> >::iterator itr;
599 itr = m_soundReqQueue.begin();
600 for (; itr != m_soundReqQueue.end(); ++itr) {
601 list<resource_request_t*>::iterator itr2;
602 itr2 = itr->second.begin();
603 for (; itr2 != itr->second.end(); ++itr2) {
604 int type = (*itr2)->resid & RESID_TYPE_MASK;
605 bool active = m_policyMgr->acquireSoundResource(type,
606 (*itr2)->soundzoneid,
608 if (true == active) {
609 resource_request_t* req = *itr2;
610 ICO_DBG("Dequeue waiting sound request queue "
611 "zone=%d req=0x%08x", itr->first, *itr2);
612 itr->second.erase(itr2);
613 updateSoundResource(req);
619 ICO_DBG("CicoSCResourceManager::releaseSoundResource Leave");
623 CicoSCResourceManager::acquireInputResource(resource_request_t *newreq)
625 ICO_DBG("CicoSCResourceManager::acquireInputResource Enter");
627 resource_request_t *req = popInputResReq(newreq);
633 CompInputResourceRequest comp(req);
634 if (true == comp(m_curInputResReq[req->input])) {
635 ICO_DBG("already acquired appid=%s pid=%d input=0x%08X",
636 req->appid, req->pid, req->input);
637 ICO_DBG("CicoSCResourceManager::acquireInputResource Leave(true)");
639 delResourceRequest(newreq);
643 bool state = m_policyMgr->acquireInputResource(req->input, req->prio);
645 updateInputResource(req);
648 ICO_DBG("Enqueue waiting input request queue input=%d req=0x%08x",
650 m_inputReqQueue[req->input].push_front(req);
653 ICO_DBG("CicoSCResourceManager::acquireInputResource Leave");
658 CicoSCResourceManager::releaseInputResource(resource_request_t *newreq)
661 CompInputResourceRequest comp(newreq);
662 for (int i = 0; i < (int)m_curInputResReq.size(); ++i) {
663 if (NULL == m_curInputResReq[i]) {
667 if (true == comp(m_curInputResReq[i])) {
668 if (NULL != m_inputCtrl) {
669 m_inputCtrl->delInputApp(m_curInputResReq[i]->appid,
670 m_curInputResReq[i]->device,
671 m_curInputResReq[i]->input);
673 delResourceRequest(newreq);
674 delResourceRequest(m_curInputResReq[i]);
675 m_curInputResReq[i] = NULL;
681 // If current request is not changed,
682 // remove the request from the waiting queue.
683 if (false == curchg) {
684 resource_request_t *req = popInputResReq(newreq);
686 delResourceRequest(req);
689 delResourceRequest(newreq);
690 ICO_DBG("CicoSCResourceManager::releaseInputResource Leave");
694 map<int, list<resource_request_t*> >::iterator itr;
695 itr = m_inputReqQueue.begin();
696 for (; itr != m_inputReqQueue.end(); ++itr) {
697 list<resource_request_t*>::iterator itr2;
698 itr2 = itr->second.begin();
699 for (; itr2 != itr->second.end(); ++itr2) {
700 bool active = m_policyMgr->acquireInputResource((*itr2)->input,
702 if (true == active) {
703 resource_request_t* req = *itr2;
704 ICO_DBG("Dequeue waiting input request queue "
705 "input=%d req=0x%08x", itr->first, *itr2);
706 itr->second.erase(itr2);
707 updateInputResource(req);
715 CicoSCResourceManager::newResourceRequest(int resid,
717 const CicoSCCommand &cmd)
719 ICO_DBG("CicoSCResourceManager::newResourceRequest Enter");
721 resource_request_t *req = NULL;
722 req = (resource_request_t*)calloc(1, sizeof(resource_request_t));
723 CicoSCCmdResCtrlOpt *opt = (CicoSCCmdResCtrlOpt*)cmd.opt;
724 CicoSCSystemConfig *systemConfig = CicoSCSystemConfig::getInstance();
726 req->reqtype = reqtype;
728 CicoSCLifeCycleController *lifeCycle =
729 CicoSCLifeCycleController::getInstance();
730 const CicoSCAilItems* ailItem = lifeCycle->findAIL(cmd.appid);
731 if (NULL != ailItem) {
732 req->category = ailItem->m_categoryID;
733 req->appkind = ailItem->m_kindID;
736 req->prio = req->category;
740 /* set resource id */
741 req->resid = RESID_TYPE_BASIC;
742 if (1 == opt->type) {
743 req->resid = RESID_TYPE_INTERRUPT;
747 req->resid |= RESID_CMD_RELEASE;
748 if (MSG_CMD_ACQUIRE_RES == cmd.cmdid) {
749 req->resid |= RESID_CMD_ACQUIRE;
752 /* set application information */
753 req->appid = strdup(cmd.appid.c_str());
755 req->state = RES_STATE_WAITING;
757 if (resid == RESID_KIND_DISPLAY) {
758 req->dispzone = strdup(opt->dispzone.c_str());
759 req->dispzoneid = systemConfig->getDizplayZoneIdbyFullName(req->dispzone);
760 req->winname = strdup(opt->winname.c_str());
761 req->surfaceid = opt->surfaceid;
762 req->id = opt->surfaceid;;
763 req->animation = strdup(opt->animation.c_str());
764 req->animationTime = opt->animationTime;
766 else if (resid == RESID_KIND_SOUND) {
767 req->soundzone = strdup(opt->soundzone.c_str());
768 req->soundzoneid = systemConfig->getSoundZoneIdbyFullName(req->soundzone);
769 ICO_DBG("req->soundzoneid=%d", req->soundzoneid);
770 req->soundname = strdup(opt->soundname.c_str());
771 req->soundid = opt->soundid;
772 req->soundadjust = opt->adjust;
773 req->id = opt->soundid;
775 else if (resid == RESID_KIND_INPUT) {
776 req->device = strdup(opt->device.c_str());
777 req->input = opt->input;
778 req->id = opt->input;
781 ICO_DBG("CicoSCResourceManager::newResourceRequest Leave"
782 "(req=0x%08x appid=%s)", req, req->appid);
787 CicoSCResourceManager::delResourceRequest(resource_request_t *req)
789 if (NULL == req) return;
791 if (NULL != req->appid) free(req->appid);
792 if (NULL != req->dispzone) free(req->dispzone);
793 if (NULL != req->winname) free(req->winname);
794 if (NULL != req->animation) free(req->animation);
795 if (NULL != req->soundzone) free(req->soundzone);
796 if (NULL != req->soundname) free(req->soundname);
797 if (NULL != req->device) free(req->device);
803 CicoSCResourceManager::enforceSound(unsigned short state,
804 resource_request_t *req,
807 ICO_DBG("CicoSCResourceManager::enforceSound Enter");
809 ICO_DBG("CicoSCResourceManager::enforceSound Leave");
812 // receive changed state
814 CicoSCResourceManager::receiveChangedState(int state)
816 ICO_DBG("CicoSCResourceManager::receiveChangedState Enter"
817 "(state=%d)", state);
819 if ((STID_DRVREGULATION_ON == state)||
820 (STID_DRVREGULATION_OFF == state)) {
822 updateDisplayResourceRegulation(state);
823 updateSoundResourceRegulation(state);
824 updateInputResourceRegulation(state);
827 ICO_DBG("CicoSCResourceManager::receiveChangedState Leave");
830 //--------------------------------------------------------------------------
832 * @brief get policy manager instance
834 * @return resource manager instace
836 //--------------------------------------------------------------------------
837 CicoSCPolicyManager *
838 CicoSCResourceManager::getPolicyManager(void)
844 CicoSCResourceManager::updateDisplayResource(resource_request_t *req,
847 ICO_DBG("CicoSCResourceManager::updateDisplayResource Enter"
848 "(req=0x%08x)", req);
849 std::map<unsigned int, resource_request_t*>::iterator itr;
850 itr = m_curDispResOwerReq.find(req->dispzoneid);
851 if ((m_curDispResOwerReq.end() != itr) && (NULL != itr->second)) {
853 if (itr->second == req) {
854 ICO_DBG("already ower appid=%s pid=%d surfaceid=0x%08X",
855 req->appid, req->pid, req->surfaceid);
856 // show request window
857 m_winCtrl->show(req->surfaceid, req->animation, req->animationTime);
858 m_winCtrl->active(req->surfaceid, -1);
861 resource_request_t *popreq = popCurDispResOwerReq(itr->second);
862 if (NULL != popreq) {
863 if (NULL != m_winCtrl) {
864 // hide current window
865 m_winCtrl->hide(popreq->surfaceid, NULL, 0);
868 // state change to waiting
869 popreq->state = RES_STATE_WAITING;
871 ICO_DBG("Enqueue waiting display resource request"
872 "(req=0x%08x appid=%s", popreq, popreq->appid);
873 m_waitingDispResReq.push_front(popreq);
875 dumpWaitingDispResReq();
880 if (NULL != m_winCtrl) {
881 if (-1 != chgzoneid) {
882 // move request window
883 m_winCtrl->setGeometry(req->surfaceid, req->dispzone,
884 req->animation, req->animationTime,
885 req->animation, req->animationTime);
887 // show request window
888 m_winCtrl->show(req->surfaceid, req->animation, req->animationTime);
890 // state change to acquired
891 req->state = RES_STATE_ACQUIRED;
892 // update current zone request
893 ICO_DBG("Enqueue current display resource ower request"
894 "(req=0x%08x zoneid=%d appid=%s)",
895 req, req->dispzoneid, req->appid);
896 m_curDispResOwerReq[req->dispzoneid] = req;
898 dumpCurDispResOwerReq();
901 // if current zone ower not exist after zone change
902 if (-1 != chgzoneid) {
903 list<resource_request_t*>::iterator itr;
904 itr = m_waitingDispResReq.begin();
905 for (; itr != m_waitingDispResReq.end(); ++itr) {
906 if (m_curDispResOwerReq[(*itr)->dispzoneid] != NULL) {
909 int type = (*itr)->resid & RESID_TYPE_MASK;
911 active = m_policyMgr->acquireDisplayResource(type,
914 if (true == active) {
915 resource_request_t* req = *itr;
916 ICO_DBG("Dequeue waiting display resource request"
917 "(req=0x%08x appid=%s)", *itr, (*itr)->appid);
918 m_waitingDispResReq.erase(itr);
920 dumpWaitingDispResReq();
922 updateDisplayResource(req);
923 m_winCtrl->active(req->surfaceid, -1);
929 ICO_DBG("CicoSCResourceManager::updateDisplayResource Leave");
933 CicoSCResourceManager::updateSoundResource(resource_request_t *req)
935 ICO_DBG("CicoSCResourceManager::updateSoundResource Enter"
936 "(req=0x%08x)", req);
937 for (int i = 0; i < (int)m_curSoundResReq.size(); ++i) {
938 ICO_DBG("zoneid=%d active=%d current=0x%08x",
939 i, m_policyMgr->getSoundZoneState(i), m_curSoundResReq[i]);
941 if (NULL == m_curSoundResReq[i]) {
945 if ((i == req->soundzoneid) ||
946 (false == m_policyMgr->getSoundZoneState(i))) {
948 // state change to waiting
949 m_curSoundResReq[i]->state = RES_STATE_WAITING;
951 ICO_DBG("Enqueue waiting sound request queue "
952 "zone=%d req=0x%08x", i, m_curSoundResReq[i]);
953 m_soundReqQueue[i].push_front(m_curSoundResReq[i]);
954 // initialize current zone request
955 m_curSoundResReq[i] = NULL;
959 if (req != m_curSoundResReq[req->soundzoneid]) {
960 ico_syc_mrp_acquire_sound_resource(req);
961 ico_syc_mrp_active_app(req->appid);
963 // state change to acquired
964 req->state = RES_STATE_ACQUIRED;
965 // update current zone request
966 m_curSoundResReq[req->soundzoneid] = req;
968 ICO_DBG("CicoSCResourceManager::updateSoundResource Leave");
972 CicoSCResourceManager::updateInputResource(resource_request_t *req)
974 ICO_DBG("CicoSCResourceManager::updateInputResource Enter"
975 "(req=0x%08x)", req);
976 for (int i = 0; i < (int)m_curInputResReq.size(); ++i) {
977 ICO_DBG("input=%d active=%d current=0x%08x",
978 i, m_policyMgr->getInputState(i), m_curInputResReq[i]);
980 if (NULL == m_curInputResReq[i]) {
984 if ((i == req->input) ||
985 (false == m_policyMgr->getInputState(i))) {
987 if (NULL != m_inputCtrl) {
989 m_inputCtrl->delInputApp(req->appid, req->device, req->input);
992 // state change to waiting
993 m_curInputResReq[i]->state = RES_STATE_WAITING;
995 ICO_DBG("Enqueue waiting input request queue "
996 "zone=%d req=0x%08x", i, m_curInputResReq[i]);
997 m_inputReqQueue[i].push_front(m_curInputResReq[i]);
998 // initialize current zone request
999 m_curInputResReq[i] = NULL;
1003 if (req != m_curInputResReq[req->input]) {
1004 // delete input control
1005 m_inputCtrl->addInputApp(req->appid, req->device, req->input, 0, 0);
1006 // state change to acquired
1007 req->state = RES_STATE_ACQUIRED;
1008 // update current zone request
1009 m_curInputResReq[req->input] = req;
1011 ICO_DBG("CicoSCResourceManager::updateInputResource Leave");
1015 CicoSCResourceManager::updateDisplayResourceRegulation(int state)
1017 ICO_DBG("CicoSCResourceManager::updateDisplayResourceRegulation Enter"
1018 "(state=%d)", state);
1020 if (STID_DRVREGULATION_ON == state) {
1021 bool curchg = false;
1022 std::map<unsigned int, resource_request_t*>::iterator itr;
1023 itr = m_curDispResOwerReq.begin();
1024 for (; itr != m_curDispResOwerReq.end(); ++itr) {
1025 resource_request_t *current = itr->second;
1026 if (NULL == current) {
1030 int type = current->resid & RESID_TYPE_MASK;
1031 bool active = false;
1032 active = m_policyMgr->acquireDisplayResource(type,
1033 current->dispzoneid,
1035 if (false == active) {
1036 if (NULL != m_winCtrl) {
1037 // hide current window
1039 m_winCtrl->hide(current->surfaceid, NULL, 0);
1045 if (false == curchg) {
1046 ICO_DBG("CicoSCResourceManager::updateDisplayResourceRegulation "
1051 list<resource_request_t*>::iterator itr2;
1052 itr2 = m_waitingDispResReq.begin();
1053 for (; itr2 != m_waitingDispResReq.end(); ++itr2) {
1054 int type = (*itr2)->resid & RESID_TYPE_MASK;
1055 bool active = false;
1056 active = m_policyMgr->acquireDisplayResource(type,
1057 (*itr2)->dispzoneid,
1059 if (true == active) {
1060 if (NULL != m_winCtrl) {
1061 // show current window
1063 m_winCtrl->show((*itr2)->surfaceid, NULL, 0);
1064 m_winCtrl->active((*itr2)->surfaceid, -1);
1070 else if (STID_DRVREGULATION_OFF == state) {
1071 std::map<unsigned int, resource_request_t*>::iterator itr;
1072 itr = m_curDispResOwerReq.begin();
1073 for (; itr != m_curDispResOwerReq.end(); ++itr) {
1074 resource_request_t *current = itr->second;
1075 if (NULL == current) {
1079 int type = current->resid & RESID_TYPE_MASK;
1080 bool active = false;
1081 active = m_policyMgr->acquireDisplayResource(type,
1082 current->dispzoneid,
1084 if (true == active) {
1085 if (NULL != m_winCtrl) {
1086 // show current window
1088 m_winCtrl->show(current->surfaceid, NULL, 0);
1089 m_winCtrl->active(current->surfaceid, -1);
1095 ICO_DBG("CicoSCResourceManager::updateDisplayResourceRegulation Leave");
1099 CicoSCResourceManager::updateSoundResourceRegulation(int state)
1101 ICO_DBG("CicoSCResourceManager::updateSoundResourceRegulation Enter"
1102 "(state=%d)", state);
1104 bool curchg = false;
1105 for (int i = 0; i < (int)m_curSoundResReq.size(); ++i) {
1106 resource_request_t *current = m_curSoundResReq[i];
1107 if (NULL == current) {
1111 int type = current->resid & RESID_TYPE_MASK;
1112 bool active = false;
1113 active = m_policyMgr->acquireSoundResource(type,
1114 current->soundzoneid,
1116 if (false == active) {
1117 // state change to waiting
1118 current->state = RES_STATE_WAITING;
1120 ICO_DBG("Enqueue waiting sound request queue "
1121 "zone=%d req=0x%08x", i, current);
1122 m_soundReqQueue[i].push_front(current);
1123 // initialize current zone request
1124 m_curSoundResReq[i] = NULL;
1129 if ((false == curchg) && (STID_DRVREGULATION_ON == state)) {
1130 ICO_DBG("CicoSCResourceManager::updateSoundResourceRegulation Leave");
1134 map<int, list<resource_request_t*> >::iterator itr;
1135 itr = m_soundReqQueue.begin();
1136 for (; itr != m_soundReqQueue.end(); ++itr) {
1137 if (NULL != m_curSoundResReq[itr->first]) {
1141 list<resource_request_t*>::iterator itr2;
1142 itr2 = itr->second.begin();
1143 for (; itr2 != itr->second.end(); ++itr2) {
1144 int type = (*itr2)->resid & RESID_TYPE_MASK;
1145 bool active = false;
1146 active = m_policyMgr->acquireSoundResource(type,
1147 (*itr2)->soundzoneid,
1149 if (true == active) {
1150 resource_request_t* req = *itr2;
1151 ICO_DBG("Dequeue waiting sound request queue "
1152 "zone=%d req=0x%08x", itr->first, *itr2);
1153 itr->second.erase(itr2);
1154 updateSoundResource(req);
1160 ICO_DBG("CicoSCResourceManager::updateSoundResourceRegulation Leave");
1164 CicoSCResourceManager::updateInputResourceRegulation(int state)
1166 ICO_DBG("CicoSCResourceManager::updateInputResourceRegulation Enter"
1167 "(state=%d)", state);
1169 bool curchg = false;
1170 for (int i = 0; i < (int)m_curInputResReq.size(); ++i) {
1171 resource_request_t *current = m_curInputResReq[i];
1172 if (NULL == current) {
1176 bool active = false;
1177 active = m_policyMgr->acquireInputResource(current->input,
1179 if (false == active) {
1180 if (NULL != m_inputCtrl) {
1181 // hide current window
1182 m_inputCtrl->delInputApp(current->appid,
1186 // state change to waiting
1187 current->state = RES_STATE_WAITING;
1189 ICO_DBG("Enqueue waiting input request queue "
1190 "zone=%d req=0x%08x", i, current);
1191 m_inputReqQueue[i].push_front(current);
1192 // initialize current zone request
1193 m_curInputResReq[i] = NULL;
1198 if ((false == curchg) && (STID_DRVREGULATION_ON == state)) {
1199 ICO_DBG("CicoSCResourceManager::updateInputResourceRegulation Leave");
1203 map<int, list<resource_request_t*> >::iterator itr;
1204 itr = m_inputReqQueue.begin();
1205 for (; itr != m_inputReqQueue.end(); ++itr) {
1206 if (NULL != m_curInputResReq[itr->first]) {
1210 list<resource_request_t*>::iterator itr2;
1211 itr2 = itr->second.begin();
1212 for (; itr2 != itr->second.end(); ++itr2) {
1213 bool active = false;
1214 active = m_policyMgr->acquireInputResource((*itr2)->input,
1216 if (true == active) {
1217 resource_request_t* req = *itr2;
1218 ICO_DBG("Dequeue waiting input request queue "
1219 "zone=%d req=0x%08x", itr->first, *itr2);
1220 itr->second.erase(itr2);
1221 updateInputResource(req);
1227 ICO_DBG("CicoSCResourceManager::updateDisplayResourceRegulation Leave");
1230 //--------------------------------------------------------------------------
1232 * @brief find currnet dipalay resource ower request
1234 * @param [in] request compare requset
1236 * @return request object on same requeset found, NULL on not found
1238 //--------------------------------------------------------------------------
1239 resource_request_t *
1240 CicoSCResourceManager::findCurDispResOwerReq(resource_request_t *req)
1243 ICO_WRN("invalid argument. req is null");
1246 std::map<unsigned int, resource_request_t*>::iterator itr;
1247 itr = m_curDispResOwerReq.begin();
1248 for (; itr != m_curDispResOwerReq.end(); ++itr) {
1249 CompDisplayResourceRequest comp(req);
1250 if (true == comp(itr->second)) {
1257 //--------------------------------------------------------------------------
1259 * @brief pop currnet dipalay resource ower request from list
1261 * @param [in] request compare requset
1263 * @return request object on same requeset found, NULL on not found
1265 //--------------------------------------------------------------------------
1266 resource_request_t *
1267 CicoSCResourceManager::popCurDispResOwerReq(resource_request_t *req)
1270 ICO_WRN("invalid argument. req is null");
1273 std::map<unsigned int, resource_request_t*>::iterator itr;
1274 itr = m_curDispResOwerReq.begin();
1275 for (; itr != m_curDispResOwerReq.end(); ++itr) {
1276 CompDisplayResourceRequest comp(req);
1277 if (true == comp(itr->second)) {
1278 ICO_DBG("Dequeue current display reoursce ower request"
1279 "(req=0x%08x zoneid=%d appid=%s)",
1280 itr->second, itr->first, itr->second->appid);
1281 resource_request_t *findreq = itr->second;
1284 dumpCurDispResOwerReq();
1292 //--------------------------------------------------------------------------
1294 * @brief dump currnet dipalay resource ower request
1296 //--------------------------------------------------------------------------
1298 CicoSCResourceManager::dumpCurDispResOwerReq(void)
1300 std::map<unsigned int, resource_request_t*>::iterator itr;
1301 itr = m_curDispResOwerReq.begin();
1302 for (; itr != m_curDispResOwerReq.end(); ++itr) {
1303 if (NULL == itr->second) {
1304 ICO_DBG("current req=0x%08x zone=%02d:(null) appid=(null)",
1305 itr->second, itr->first);
1308 ICO_DBG("current req=0x%08x zone=%02d:%s appid=%s",
1309 itr->second, itr->first, itr->second->dispzone,
1310 itr->second->appid);
1315 //--------------------------------------------------------------------------
1317 * @brief find waiting dipalay resource request
1319 * @param [in] request compare requset
1321 * @return request object on same requeset found, NULL on not found
1323 //--------------------------------------------------------------------------
1324 resource_request_t *
1325 CicoSCResourceManager::findWaitingDispResReq(resource_request_t *req)
1328 ICO_WRN("invalid argument. req is null");
1331 CompDisplayResourceRequest comp(req);
1332 std::list<resource_request_t*>::iterator itr;
1333 itr = find_if(m_waitingDispResReq.begin(), m_waitingDispResReq.end(), comp);
1334 if (m_waitingDispResReq.end() != itr) {
1340 //--------------------------------------------------------------------------
1342 * @brief pop waiting dipalay resource request from waiting list
1344 * @param [in] request compare requset
1346 * @return request object on same requeset found, NULL on not found
1348 //--------------------------------------------------------------------------
1349 resource_request_t *
1350 CicoSCResourceManager::popWaitingDispResReq(resource_request_t *req)
1353 ICO_WRN("invalid argument. req is null");
1356 CompDisplayResourceRequest comp(req);
1357 std::list<resource_request_t*>::iterator itr;
1358 itr = find_if(m_waitingDispResReq.begin(), m_waitingDispResReq.end(), comp);
1359 if (m_waitingDispResReq.end() != itr) {
1360 ICO_DBG("Dequeue waiting display resource request"
1361 "(req=0x%08x zone:%02d:%s appid=%s)",
1362 *itr, (*itr)->dispzoneid, (*itr)->dispzone, (*itr)->appid);
1363 resource_request_t *findreq = *itr;
1364 m_waitingDispResReq.erase(itr);
1366 dumpWaitingDispResReq();
1373 //--------------------------------------------------------------------------
1375 * @brief dump waiting dipalay resource request
1377 //--------------------------------------------------------------------------
1379 CicoSCResourceManager::dumpWaitingDispResReq(void)
1381 std::list<resource_request_t*>::iterator itr;
1382 itr = m_waitingDispResReq.begin();
1383 for (; itr != m_waitingDispResReq.end(); ++itr) {
1385 ICO_DBG("waiting req=null");
1388 ICO_DBG("waiting req=0x%08x zone=%02d:%s appid=%s",
1389 *itr, (*itr)->dispzoneid, (*itr)->dispzone, (*itr)->appid);
1393 // vim:set expandtab ts=4 sw=4: