/*
 *  Constructor for class.
 */
Controller::Controller( Camera *camera, Import *import )
{
    sdkLoaded = false;
    doLive = false;
    bulbLock = false;
    evfImageData = NULL;
    shotSeq = NULL;

    this->camera = camera;
    this->import = import;

    listener = new Listener;
    qRegisterMetaType<EdsPropertyEvent>("EdsPropertyEvent");
    qRegisterMetaType<EdsPropertyID>("EdsPropertyID");
    qRegisterMetaType<EdsUInt32>("EdsUInt32");
    qRegisterMetaType<EdsObjectEvent>("EdsObjectEvent");
    qRegisterMetaType<EdsBaseRef>("EdsBaseRef");
    qRegisterMetaType<EdsStateEvent>("EdsStateEvent");
    QObject::connect(
	listener, SIGNAL(propertyEvent(EdsPropertyEvent,EdsPropertyID,EdsUInt32)),
	this, SLOT(handlePropertyEvent(EdsPropertyEvent,EdsPropertyID,EdsUInt32)));

    QObject::connect(
	listener, SIGNAL(objectEvent(EdsObjectEvent,EdsBaseRef)),
	this, SLOT(handleObjectEvent(EdsObjectEvent,EdsBaseRef)));

    QObject::connect(
	listener, SIGNAL(stateEvent(EdsStateEvent,EdsUInt32)),
	this, SLOT(handleStateEvent(EdsStateEvent,EdsUInt32)));

    QObject::connect(
	listener, SIGNAL(cameraAddedEvent()),
	this, SLOT(handleCameraAddedEvent()));

    //qRegisterMetaType<Event>("Event");
    QObject::connect(
	listener, SIGNAL(eventReport(Event *)),
	this, SIGNAL(eventReport(Event *)));

    timer = new QTimer(this);
    QObject::connect(
	timer, SIGNAL(timeout()),
	this, SLOT(messagePump()) );
    timer->start( Controller::timerPeriod );
}
void rspfConnectableObjectListener::processEvent(rspfEvent& event)
{
   switch(event.getId())
   {
      case RSPF_EVENT_OBJECT_DESTRUCTING_ID:
      {
         rspfObjectDestructingEvent* eventCast = dynamic_cast<rspfObjectDestructingEvent*>(&event);
         if(eventCast) objectDestructingEvent(*eventCast);
         
         break;
      }
      case RSPF_EVENT_CONNECTION_CONNECT_ID:
      case RSPF_EVENT_CONNECTION_DISCONNECT_ID:
      {
         rspfConnectionEvent* eventCast = dynamic_cast<rspfConnectionEvent*>(&event);
         
         if(eventCast)
         {
            connectionEvent(*eventCast);
         
            if(event.getId() == RSPF_EVENT_CONNECTION_DISCONNECT_ID)
            {
               if(eventCast->isInputDirection())
               {
                  disconnectInputEvent(*eventCast);
               }
               else if(eventCast->isOutputDirection())
               {
                  disconnectOutputEvent(*eventCast);
               }
               else
               {
                  rspfNotify(rspfNotifyLevel_WARN) << "rspfConnectableObjectListener::processEvent, Direction not set\n";
               }
            }
            else
            {
               if(eventCast->isInputDirection())
               {
                  connectInputEvent(*eventCast);
               }
               else if(eventCast->isOutputDirection())
               {
                  connectOutputEvent(*eventCast);
               }
               else
               {
                  rspfNotify(rspfNotifyLevel_WARN) << "rspfConnectableObjectListener::processEvent, Direction not set\n";
               }
            }
         }
         break;
      }
      case RSPF_EVENT_PROPERTY_ID:
      {
         rspfPropertyEvent* eventCast = dynamic_cast<rspfPropertyEvent*>(&event);
         if(eventCast) propertyEvent(*eventCast);
         break;
      }
      case RSPF_EVENT_ADD_OBJECT_ID:
      {
         rspfContainerEvent* eventCast = dynamic_cast<rspfContainerEvent*>(&event);
         if(eventCast)
         {
            containerEvent(*eventCast);
            addObjectEvent(*eventCast);
         }
         break;
      }
      case RSPF_EVENT_REMOVE_OBJECT_ID:
      {
         rspfContainerEvent* eventCast = dynamic_cast<rspfContainerEvent*>(&event);
         if(eventCast)
         {
            containerEvent(*eventCast);
            removeObjectEvent(*eventCast);
         }
         break;
      }
      case RSPF_EVENT_REFRESH_ID:
      {
         rspfRefreshEvent* eventCast = dynamic_cast<rspfRefreshEvent*>(&event);
         if(eventCast) refreshEvent(*eventCast);
         break;
      }
      default:
      {
         rspfListener::processEvent(event);
         break;
      }
   }
}