* @author Yunchan Cho (yunchan.cho@samsung.com)
*/
#include <string>
+#include <Ecore.h>
#include <Plugin/IBoxPluginFactory.h>
#include "Buffer/IRenderBuffer.h"
+#include "Buffer/RenderBuffer.h"
#include "Buffer/RenderBufferFactory.h"
#include "Util/Log.h"
+#include "Util/Util.h"
#include "BoxData.h"
#include "IBoxState.h"
#include "BoxState.h"
, m_currentTab(true)
, m_paused(false)
, m_updateNeeded(false)
+ , m_lastUpdateRequestTime()
{
LogD("enter");
try {
boxInfo->contentInfo);
m_boxBuffer->allocate();
m_view = m_factory->createRenderView(
- boxInfo->boxId, boxInfo->instanceId,
- m_boxBuffer->getWindow(),
+ boxInfo->boxId,
+ boxInfo->instanceId,
ewkContext);
m_updateTimer = BoxUpdateTimer::create(
boxInfo->period,
try {
m_updateTimer->start();
- m_boxBuffer->startCanvasUpdate();
- RenderInfoPtr renderInfo = makeRenderInfo(renderTypeCreate);
+ RenderInfoPtr renderInfo = makeRenderInfo(renderTypeCreate, URL_TYPE_BOX);
m_view->showBox(renderInfo);
} catch (...) {
return false;
CHECK_BOX_STATE(m_state, permitHide);
try {
+ if (m_pdBuffer) {
+ m_pdBuffer->stopCanvasUpdate();
+ m_view->hidePd();
+ m_pdBuffer->free();
+ m_pdBuffer.reset();
+ }
+
m_updateTimer->stop();
+ m_boxBuffer->stopCanvasUpdate();
m_view->hideBox();
m_boxBuffer->free();
+ m_boxBuffer.reset();
} catch (...) {
return false;
}
m_updateTimer->restart();
m_boxBuffer->reallocate(
m_boxInfo->boxWidth, m_boxInfo->boxHeight);
- RenderInfoPtr renderInfo = makeRenderInfo(renderTypeResize);
+ RenderInfoPtr renderInfo = makeRenderInfo(renderTypeResize, URL_TYPE_BOX);
m_view->showBox(renderInfo);
} catch (...) {
LogD("resize exception");
}
SWITCH_BOX_STATE();
- return true;
+ return true;
}
bool Box::resume()
{
- LogD("enter");
+ LogD("enter");
CHECK_BOX_STATE(m_state, permitResume);
try {
if (m_updateNeeded) {
m_updateNeeded = false;
- return update();
+ updateInternal();
} else {
m_view->resumeBox();
}
m_boxInfo->pdWidth,
m_boxInfo->pdHeight);
m_pdBuffer->allocate();
- RenderInfoPtr renderInfo = makeRenderInfo(renderTypeOpenPd);
- m_view->showPd(m_pdBuffer->getWindow(), renderInfo);
+ m_pdBuffer->stopCanvasUpdate();
+ RenderInfoPtr pdRenderInfo = makeRenderInfo(renderTypeOpenPd, URL_TYPE_PD);
+ RenderInfoPtr boxRenderInfo = makeRenderInfo(renderTypeOpenPd, URL_TYPE_BOX);
+ m_view->showPd(pdRenderInfo, boxRenderInfo);
+ ecore_idler_add(startUpdateRenderBufferIdlerCallback, m_pdBuffer.get());
} catch (...) {
return false;
}
CHECK_BOX_STATE(m_state, permitClosePd);
try {
+ m_pdBuffer->stopCanvasUpdate();
m_view->hidePd();
m_pdBuffer->free();
+ m_pdBuffer.reset();
m_updateTimer->restart();
} catch (...) {
return false;
}
+ // if box update is requested during pd opening
+ if (m_updateNeeded) {
+ updateInternal();
+ }
+
SWITCH_BOX_STATE();
return true;
}
-bool Box::update()
+bool Box::update(time_t requestTime, std::string& contentInfo)
{
LogD("enter");
- if (m_paused) {
- // update is dalayed until this box goes to current tab
+ m_lastUpdateRequestTime = requestTime;
+ m_boxInfo->contentInfo = contentInfo;
+ if (m_paused || m_pdBuffer) {
+ // update is dalayed
+ // until this box goes to current tab or pd is closed
m_updateNeeded = true;
return true;
}
- m_boxBuffer->startCanvasUpdate();
- RenderInfoPtr renderInfo = makeRenderInfo(renderTypeUpdate);
- m_view->showBox(renderInfo);
+ try {
+ updateInternal();
+ } catch (...) {
+ return false;
+ }
return true;
}
return m_currentTab;
}
-RenderInfoPtr Box::makeRenderInfo(const std::string& renderType) const
+time_t Box::getLastUpdateRequestTime()
+{
+ return m_lastUpdateRequestTime;
+}
+
+RenderInfoPtr Box::makeRenderInfo(const std::string& renderType, UrlType urlType) const
{
LogD("enter");
RenderInfoPtr renderInfo(new RenderInfo);
renderInfo->defaultUrlParams = "?type=" + renderType;
// set width, height
- if (renderType == renderTypeOpenPd) {
- renderInfo->width = m_boxInfo->pdWidth;
- renderInfo->height = m_boxInfo->pdHeight;
- } else {
+ switch (urlType) {
+ case URL_TYPE_BOX:
+ renderInfo->window = m_boxBuffer->getWindow();
renderInfo->width = m_boxInfo->boxWidth;
renderInfo->height = m_boxInfo->boxHeight;
+ break;
+ case URL_TYPE_PD:
+ renderInfo->window = m_pdBuffer->getWindow();
+ renderInfo->width = m_boxInfo->pdWidth;
+ renderInfo->height = m_boxInfo->pdHeight;
+ break;
+ default:
+ LogD("error url type");
+ return RenderInfoPtr();
}
+
char buff[32];
sprintf(buff, "&width=%d&height=%d", renderInfo->width, renderInfo->height);
renderInfo->defaultUrlParams += buff;
return renderInfo;
}
+void Box::updateInternal()
+{
+ LogD("enter");
+ RenderInfoPtr renderInfo = makeRenderInfo(renderTypeUpdate, URL_TYPE_BOX);
+ m_view->showBox(renderInfo);
+}
+
void Box::setState(IBoxStatePtr state)
{
+ UNUSED_PARAM(state);
// assign new state
//m_state = state;
}
LogD("enter");
Box* This = static_cast<Box*>(data);
- This->update();
+ This->updateInternal();
return ECORE_CALLBACK_RENEW;
}
+Eina_Bool Box::startUpdateRenderBufferIdlerCallback(void* data)
+{
+ LogD("enter");
+ RenderBuffer* buffer = static_cast<RenderBuffer*>(data);
+ if (!buffer) {
+ LogD("no buffer");
+ } else {
+ buffer->startCanvasUpdate();
+ }
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+BoxInfoPtr Box::getBoxInfo()
+{
+ LogD("enter");
+ return m_boxInfo;
+}