void PolygonCleaner::Run(gstGeodeHandle* const geodeh) {
  assert(geodeh);
  geode_creator_.SetPrimType((*geodeh)->PrimType());

  switch ((*geodeh)->PrimType()) {
    case gstUnknown:
    case gstPoint:
    case gstPoint25D:
      return;

    case gstPolyLine:
    case gstStreet:
    case gstPolyLine25D:
    case gstStreet25D:
      return;

    case gstPolygon:
    case gstPolygon25D:
      ProcessPolygon(geodeh);
      break;

    case gstPolygon3D:
      notify(NFY_WARN,
             "PolygonCleaner: not supported geometry type: %d",
             (*geodeh)->PrimType());
      return;

    case gstMultiPolygon:
    case gstMultiPolygon25D:
      {
        gstGeodeCollection *multi_geode =
            static_cast<gstGeodeCollection*>(&(**geodeh));
        for (uint p = 0; p < multi_geode->NumParts(); ++p) {
          gstGeodeHandle &cur_geodeh = multi_geode->GetGeode(p);
          ProcessPolygon(&cur_geodeh);
          if (cur_geodeh->IsEmpty()) {
            notify(NFY_DEBUG, "Multi-geode part was empty or invalid"
                   " (and forced empty): skipped.");
          }
        }
      }
      break;

    case gstMultiPolygon3D:
      notify(NFY_WARN,
             "PolygonCleaner: not supported geometry type: %d",
             (*geodeh)->PrimType());
      return;
  }

  // Reports result.
  (*geodeh)->Clear();
  geode_creator_.Report(geodeh);
  geode_creator_.Clean();
}
	RESULTCODE PolygonToLineProcessorImpl::Process(FeatureClass* pinFeatureClass, FeatureClass* poutFeatureClass)
	{
		Geometry *pGeometry = NULL;
		Feature	 *pFeature = NULL;
		FeatureCursor* pCursor = pinFeatureClass->Query();

		FeatureInsertCommand* cmd = poutFeatureClass->CreateInsertCommand();

		while((pFeature=pCursor->NextFeature())!=NULL)
		{
			pGeometry = pFeature->GetGeometry();
			if( pGeometry != NULL )
			{
				switch(pGeometry->GeometryType())
				{
				case augeGTPolygon:
					ProcessPolygon(pFeature, poutFeatureClass, cmd);
					break;
				case augeGTMultiPolygon:
					ProcessMultiPolygon(pFeature, poutFeatureClass, cmd);
					break;
				}
			}

			pFeature->Release();
		}
		pCursor->Release();

		cmd->Commit();
		cmd->Release();

		return AG_SUCCESS;
	}