GeckoFilter C++ version

struct GeckoFilter : public HttpDir
      GeckoFilter(const char* dirName);
      /* Callback must be a static C++ method.
         We do not use virtual functions in C++ since virtual
         functions are not compatible with C code.
      static int doService(
         GeckoFilter* o,const char* relPath,HttpCommand* cmd);

      /* The original HttpDir service function, which we will overload. */ 
      HttpDir_Service orgServiceFunc;
} GeckoFilter;

   The C++ code constructor
GeckoFilter::GeckoFilter(const char* dirName) :
   HttpDir(dirName) /* Run super class constructor */
   /* Overload the original service function and save the original
    * service function in orgServiceFunc. We need the original
    * service function in our GeckoFilter::doService, see below.
   o->orgServiceFunc = overloadService((HttpDir_Service)GeckoFilter_doService);

/* Our service function is called when the Virtual File System delegates
   a client request to the GeckoFilter.
GeckoFilter::doService(GeckoFilter* o,
                      const char* relPath,
                      HttpCommand* cmd) 
   /* Extract the HTTP parameter "User-Agent". The user agent tells us which
    * browser that is doing the request.
    * The "User-Agent" string for Mozilla looks like:
    * User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/2003024
   HttpRequest* request = cmd->getRequest();
   HttpResponse* response = cmd->getResponse();
   const char* userAgent = request->getHeaderValue("User-Agent");

   /* Check if the string contains "Gecko", which tells us if this is a
    * Gecko based browser such as the Mozilla Web-Browser.
   if(userAgent && strstr(userAgent, "Gecko"))
      /* Yes this is a "Gecko" based Web-Browser.
       * Let the original service function complete the request.
      return (*o->orgServiceFunc)(o, relPath, response);
      /* No, this is NOT a "Gecko" based Web-Browser. */
      /* Deny the request */
      response->sendError(403, /* 403 Forbidden */
                          "You do not use a Gecko based browser");

      /* Barracuda makes it possible to have duplicate directories. If one
       * branch cannot find the requested page, the next bransh with the same
       * name is searched. "Not found" is signalled by returning -1. We want
       * to stop the seach since we already sent a response. We signal
       * success, "page found", by returning 0.
      return 0;