#include "VideoServiceProvider.h"

VideoServiceProvider::VideoServiceProvider (CORBA::ORB_ptr orb)
  : orbVar_ (CORBA::ORB::_duplicate (orb))
  , adapter_ (orbVar_.in (), ACE_TEXT ("ServiceProvider"))
  , adapterVideos_ (orbVar_.in (), ACE_TEXT ("Videos"))
{
  adapter_.createTransient ();
  adapter_.addServantToAdapter (this, ACE_TEXT ("provider"), 0);
}

/*
 * @func IDL defined funtion that returns a list of companies managed by this service provider
 */
Server::CompanyNameList *
VideoServiceProvider::getCompanies (void)
{
  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Service Provider: managed companies:\n")));

  Server::CompanyNameList *companies = 0;
  ACE_NEW_RETURN (companies,
                  Server::CompanyNameList,
                  0);
  Server::CompanyNameList_var holder (companies);

  companies->length (static_cast<CORBA::ULong> (companies_.size ()));
  VideoCompany **company;
  int count = 0;

  for (VideoCompanyArray::ITERATOR itb = VideoCompanyArray::ITERATOR (companies_);
       itb.next (company) != 0; itb.advance ())
    {
      (*companies)[count] = (*company)->getName ();
      ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%s\n"), (*company)->getName ()));
      ++count;
    }

  return holder._retn ();
}

void
VideoServiceProvider::store (VideoCompany *company, const char *name)
{
  if (companies_.size () == 0)
    {
      adapterVideos_.createTransient (company);
    }
  else
    {
      adapterVideos_.addServantToAdapter (company, name, 0);
    }

  companies_.size (companies_.size () + 1);
  companies_[companies_.size () - 1] = company;
}

void
VideoServiceProvider::activateManager (void)
{
  adapter_.activateManager ();
  adapterVideos_.activateManager ();
}

void
VideoServiceProvider::helloWorld (void)
{
  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Hello World\n")));
}
