Listing 2: Implementation for non-CORBA system

//
// File: fortune.cpp
//

#include <stdlib.h>
#include <assert.h>
#include <string.h>

#include "fortune.h"

// Init static value
int
Teller_impl::_tcount = 0;

// Constructor
Teller_impl::Teller_impl(const char* s)
  : _msg(0), _num(0)
{
   assert(s != NULL);
   _msg = new char[strlen(s)+1];
   assert(_msg != NULL);
   strcpy(_msg, s);  
   _num = ++_tcount;
}

// Destructor
Teller_impl::~Teller_impl()
{
   if(_msg) delete [] _msg;
}

// getMessage
char* Teller_impl::getMessage()
{
   return _msg;
}

// getLuckyNumber
int Teller_impl::getLuckyNumber()
{
   return _num;
}

// Array of fortune messages
static char* 
fortunes[] = {
 "Jan: Your day will be glorious.",
 "Feb: You are going to be very rich.",
 "Mar: Finish up old tasks.",   
 "Apr: Your hard work will pay off.",
 "May: You will live a long life.",
 "Jun: You are going in new directions.",
 "Jul: Good fortune will come to you.",
 "Aug: You are full of wit and energy.",
 "Sep: Trust your instincts.",
 "Oct: Ask and you shall receive.",
 "Nov: Success is headed your way.",
 "Dec: You can accomplish anything.",
};

// Constructor
Factory_impl::Factory_impl()
{
   _mcount = sizeof(fortunes)/sizeof(char*);
   _list = new Teller_impl*[_mcount];
   assert(_list);
   for (int i=0; i<_mcount; i++) {
      _list[i] = new Teller_impl(fortunes[i]);
      assert(_list[i]);
   } 
}

// Destructor
Factory_impl::~Factory_impl()
{
   for (int i=0; i<_mcount; i++) {
      if(_list[i]) delete _list[i]; 
   } 
   if (_list) delete [] _list;
}

// getFortune
Teller_impl*
Factory_impl::getFortune(int month)
{
   if((month <= 0) || (month > _mcount)) 
      throw outOfBounds();
   return _list[month-1];
}
//End of File