
class SdxCapabilities : public FdoIConnectionCapabilities,
                        public FdoISchemaCapabilities,
                        public FdoICommandCapabilities,
                        public FdoIFilterCapabilities,
                        public FdoIExpressionCapabilities,
                        public FdoIRasterCapabilities,
                        public FdoITopologyCapabilities,
                        public FdoIGeometryCapabilities
{

    //-------------------------------------------------------
    // FdoIConnectionCapabilities implementation
    //-------------------------------------------------------

    SDX_API virtual FdoThreadCapability GetThreadCapability()               { return FdoThreadCapability_PerConnectionThreaded; }
    SDX_API virtual bool SupportsLocking()                                  { return false; }
    SDX_API virtual FdoLockType* GetLockTypes(FdoInt32& size)               { size=0; return NULL; }
    SDX_API virtual bool SupportsTimeout()                                  { return false; }
    SDX_API virtual bool SupportsTransactions()                             { return false; }
    SDX_API virtual bool SupportsLongTransactions()                         { return false; }
    SDX_API virtual bool SupportsSQL()                                      { return true;  }
    SDX_API virtual bool SupportsConfiguration()                            { return false; }
    SDX_API virtual bool SupportsMultipleSpatialContexts()                  { return false; }
    SDX_API virtual bool SupportsCSysWKTFromCSysName()                      { return false; }
    SDX_API virtual bool SupportsWrite()                                    { return false; }
    SDX_API virtual bool SupportsMultiUserWrite()                           { return false; }
    SDX_API virtual FdoSpatialContextExtentType* GetSpatialContextTypes(FdoInt32& length)
    {
        static FdoSpatialContextExtentType spatialTypes[] =
        {
                                                                //          FdoSpatialContextExtentType_Static,
                                                                            FdoSpatialContextExtentType_Dynamic
        };

        length = sizeof(spatialTypes) / sizeof(FdoSpatialContextExtentType);
        return spatialTypes;
    }
    SDX_API virtual bool SupportsFlush()                                    { return false; }


    //-------------------------------------------------------
    // FdoISchemaCapabilities implementation
    //-------------------------------------------------------

    SDX_API virtual bool SupportsInheritance()                              { return false; }
    SDX_API virtual bool SupportsMultipleSchemas()                          { return false; }
    SDX_API virtual bool SupportsObjectProperties()                         { return false; }
    SDX_API virtual bool SupportsAssociationProperties()                    { return false; }
    SDX_API virtual bool SupportsSchemaOverrides()                          { return false; }
    SDX_API virtual bool SupportsNetworkModel()                             { return false; }
    SDX_API virtual bool SupportsAutoIdGeneration()                         { return true;  }
    SDX_API virtual bool SupportsDataStoreScopeUniqueIdGeneration()         { return false; }
    SDX_API virtual bool SupportsSchemaModification()                       { return true;  }
    SDX_API virtual bool SupportsInclusiveValueRangeConstraints()           { return false; }
    SDX_API virtual bool SupportsExclusiveValueRangeConstraints()           { return false; }
    SDX_API virtual bool SupportsValueConstraintsList()                     { return false; }
    SDX_API virtual bool SupportsNullValueConstraints()                     { return true;  }
    SDX_API virtual bool SupportsUniqueValueConstraints()                   { return true;  }
    SDX_API virtual bool SupportsCompositeUniqueValueConstraints()          { return false; }
    SDX_API virtual bool SupportsCompositeId()                              { return false; }
    SDX_API virtual bool SupportsDefaultValue()                             { return false; }


    SDX_API virtual FdoInt64 GetMaximumDataValueLength(FdoDataType dataType){ return -1; }
    SDX_API virtual FdoInt32 GetMaximumDecimalPrecision()                   { return -1; }
    SDX_API virtual FdoInt32 GetMaximumDecimalScale()                       { return -1; }
    SDX_API virtual FdoInt32 GetNameSizeLimit(FdoSchemaElementNameType name){ return -1; }
    SDX_API virtual FdoString* GetReservedCharactersForName()               { return NULL; }
    
    SDX_API virtual FdoDataType* GetSupportedAutoGeneratedTypes(FdoInt32& length)
    {
        static FdoDataType dataTypes[] =
        {
                                                                //          FdoDataType_Boolean,
                                                                //          FdoDataType_Byte,
                                                                //          FdoDataType_DateTime,
                                                                //          FdoDataType_Decimal,
                                                                //          FdoDataType_Double,
                                                                //          FdoDataType_Int16,
                                                                            FdoDataType_Int32,
                                                                            FdoDataType_Int64,
                                                                //          FdoDataType_Single,
                                                                //          FdoDataType_String,
                                                                //          FdoDataType_BLOB,
                                                                //          FdoDataType_CLOB,
                                                                //          FdoDataType_UniqueID
        };

        length = sizeof(dataTypes) / sizeof(FdoDataType);
        return dataTypes;
    }
    
    SDX_API virtual FdoDataType* GetSupportedIdentityPropertyTypes(FdoInt32& length)
    {
       static FdoDataType dataTypes[] =
        {
                                                                            FdoDataType_Boolean,
                                                                            FdoDataType_Byte,
                                                                            FdoDataType_DateTime,
                                                                            FdoDataType_Decimal,
                                                                            FdoDataType_Double,
                                                                            FdoDataType_Int16,
                                                                            FdoDataType_Int32,
                                                                            FdoDataType_Int64,
                                                                            FdoDataType_Single,
                                                                            FdoDataType_String,
                                                                            FdoDataType_BLOB,
                                                                //          FdoDataType_CLOB,
                                                                //          FdoDataType_UniqueID
        };

        length = sizeof(dataTypes) / sizeof(FdoDataType);
        return dataTypes;
    }

    SDX_API virtual FdoClassType* GetClassTypes(FdoInt32& length)
    {
        static FdoClassType classTypes[] =
        {
                                                                            FdoClassType_Class,
                                                                            FdoClassType_FeatureClass
        };

        length = sizeof(classTypes) / sizeof(FdoClassType);
        return classTypes;
    }
    
    SDX_API virtual FdoDataType* GetDataTypes(FdoInt32& length)
    {
        static FdoDataType dataTypes[] =
        {
                                                                            FdoDataType_Boolean,
                                                                            FdoDataType_Byte,
                                                                            FdoDataType_DateTime,
                                                                //          FdoDataType_Decimal,
                                                                            FdoDataType_Double,
                                                                            FdoDataType_Int16,
                                                                            FdoDataType_Int32,
                                                                            FdoDataType_Int64,
                                                                            FdoDataType_Single,
                                                                            FdoDataType_String,
                                                                            FdoDataType_BLOB,
                                                                //          FdoDataType_CLOB,
                                                                //          FdoDataType_UniqueID
        };

        length = sizeof(dataTypes) / sizeof(FdoDataType);
        return dataTypes;
    }

    //-------------------------------------------------------
    // FdoICommandCapabilities implementation
    //-------------------------------------------------------

    SDX_API virtual FdoInt32* GetCommands(FdoInt32& size)
    {
    // read-write commands
        static const FdoInt32 commandsReadWrite[] =
        {
                                                                            FdoCommandType_Select,
                                                                            FdoCommandType_Insert,
                                                                            FdoCommandType_Delete,
                                                                            FdoCommandType_Update,
                                                                            FdoCommandType_DescribeSchema,
                                                                            FdoCommandType_ApplySchema,
                                                                //          FdoCommandType_DestroySchema,
                                                                //          FdoCommandType_ActivateSpatialContext,
                                                                //          FdoCommandType_CreateSpatialContext,
                                                                //          FdoCommandType_DestroySpatialContext,
                                                                            FdoCommandType_GetSpatialContexts,
                                                                //          FdoCommandType_CreateMeasureUnit,
                                                                //          FdoCommandType_DestroyMeasureUnit,
                                                                //          FdoCommandType_GetMeasureUnits,
                                                                            FdoCommandType_SQLCommand,
                                                                //          FdoCommandType_AcquireLock,
                                                                //          FdoCommandType_GetLockInfo,
                                                                //          FdoCommandType_GetLockedObjects,
                                                                //          FdoCommandType_GetLockOwners,
                                                                //          FdoCommandType_ReleaseLock,
                                                                //          FdoCommandType_ActivateLongTransaction,
                                                                //          FdoCommandType_CommitLongTransaction,
                                                                //          FdoCommandType_CreateLongTransaction,
                                                                //          FdoCommandType_GetLongTransactions,
                                                                //          FdoCommandType_FreezeLongTransaction,
                                                                //          FdoCommandType_RollbackLongTransaction,
                                                                //          FdoCommandType_ActivateLongTransactionCheckpoint,
                                                                //          FdoCommandType_CreateLongTransactionCheckpoint,
                                                                //          FdoCommandType_GetLongTransactionCheckpoints,
                                                                //          FdoCommandType_RollbackLongTransactionCheckpoint,
                                                                //          FdoCommandType_ChangeLongTransactionPrivileges,
                                                                //          FdoCommandType_GetLongTransactionPrivileges,
                                                                //          FdoCommandType_ChangeLongTransactionSet,
                                                                //          FdoCommandType_GetLongTransactionsInSet,
                                                                            FdoCommandType_SelectAggregates,
                                                                            FdoCommandType_CreateDataStore,
                                                                //          FdoCommandType_DestroyDataStore,
        };

        size = sizeof(commandsReadWrite) / sizeof(FdoCommandType);
        return (FdoInt32*)commandsReadWrite;
    }
    
    SDX_API virtual bool SupportsParameters()                               { return false; }
    //SDX_API virtual bool SupportsTimeout()                                { return false; }
    SDX_API virtual bool SupportsSelectExpressions()                        { return true;  }
    SDX_API virtual bool SupportsSelectFunctions()                          { return true;  }
    SDX_API virtual bool SupportsSelectDistinct()                           { return true;  }
    SDX_API virtual bool SupportsSelectOrdering()                           { return false; }
    SDX_API virtual bool SupportsSelectGrouping()                           { return false; }


    //-------------------------------------------------------
    // FdoIFilterCapabilities implementation
    //-------------------------------------------------------

    SDX_API virtual FdoConditionType* GetConditionTypes(FdoInt32& length)
    {
        static FdoConditionType conditionTypes[] =
        {
                                                                            FdoConditionType_Comparison,
                                                                            FdoConditionType_Like,
                                                                            FdoConditionType_In,
                                                                            FdoConditionType_Null,
                                                                            FdoConditionType_Spatial
        };

        length = sizeof(conditionTypes) / sizeof(FdoConditionType);
        return conditionTypes;
    }
    
    SDX_API virtual FdoSpatialOperations* GetSpatialOperations(FdoInt32& length)
    {
        static FdoSpatialOperations spatialOperations[] =
        {
                                                                    //      FdoSpatialOperations_Contains,
                                                                    //      FdoSpatialOperations_Crosses,
                                                                    //      FdoSpatialOperations_Disjoint,
                                                                    //      FdoSpatialOperations_Equals,
                                                                    //      FdoSpatialOperations_Intersects,
                                                                    //      FdoSpatialOperations_Overlaps,
                                                                    //      FdoSpatialOperations_Touches,
                                                                    //      FdoSpatialOperations_Within,
                                                                    //      FdoSpatialOperations_CoveredBy,
                                                                    //      FdoSpatialOperations_Inside,
                                                                            FdoSpatialOperations_EnvelopeIntersects
        };

        length = sizeof(spatialOperations) / sizeof(FdoSpatialOperations);
        return spatialOperations;
    }
    
    SDX_API virtual FdoDistanceOperations* GetDistanceOperations(FdoInt32& length)
    {
//  static FdoDistanceOperations distanceOperations[] =
//  {
                                                                    //      FdoDistanceOperations_Beyond,
                                                                    //      FdoDistanceOperations_Within
//  };

//  length = sizeof(distanceOperations) / sizeof(FdoDistanceOperations);
//  return distanceOperations;

    // currently no support
        length = 0;
        return NULL;
    }
    
    SDX_API virtual bool SupportsGeodesicDistance()                         { return false; }
    SDX_API virtual bool SupportsNonLiteralGeometricOperations()            { return false; }

    //-------------------------------------------------------
    // FdoIExpressionCapabilities implementation
    //-------------------------------------------------------

    SDX_API virtual FdoExpressionType* GetExpressionTypes(FdoInt32& length)
    {
        static FdoExpressionType expressionTypes[] =
        {
                                                                            FdoExpressionType_Basic,
                                                                            FdoExpressionType_Function,
                                                                //          FdoExpressionType_Parameter
        };

        length = sizeof(expressionTypes) / sizeof(FdoExpressionType);
        return expressionTypes;
    }
    
    SDX_API virtual FdoFunctionDefinitionCollection* GetFunctions()
    {
        FdoFunctionDefinitionCollection* ret = FdoFunctionDefinitionCollection::Create ();
    
    // Add well-known functions we support to the list:
        FdoPtr<FdoFunctionDefinitionCollection> 
            wellKnownFunctions = GetWellKnownFunctions();
        FdoPtr<FdoFunctionDefinition> wellKnownFunction;

        wellKnownFunction = wellKnownFunctions->GetItem(                    FDO_FUNCTION_COUNT);
        ret->Add(wellKnownFunction);
        wellKnownFunction = wellKnownFunctions->GetItem(                    FDO_FUNCTION_MIN);
        ret->Add(wellKnownFunction);
        wellKnownFunction = wellKnownFunctions->GetItem(                    FDO_FUNCTION_AVG);
        ret->Add(wellKnownFunction);
        wellKnownFunction = wellKnownFunctions->GetItem(                    FDO_FUNCTION_MAX);
        ret->Add(wellKnownFunction);
        wellKnownFunction = wellKnownFunctions->GetItem(                    FDO_FUNCTION_SUM);
        ret->Add(wellKnownFunction);
        wellKnownFunction = wellKnownFunctions->GetItem(                    FDO_FUNCTION_CONCAT);
        ret->Add(wellKnownFunction);
        wellKnownFunction = wellKnownFunctions->GetItem(                    FDO_FUNCTION_SPATIALEXTENTS);
        ret->Add(wellKnownFunction);

    // Add NOT-well-known functions we support to the list:

        return ret;
    }

    //-------------------------------------------------------
    // FdoIRasterCapabilities implementation
    //-------------------------------------------------------

    SDX_API virtual bool SupportsRaster ()                                  { return false; }
    SDX_API virtual bool SupportsStitching ()                               { return false; }
    SDX_API virtual bool SupportsSubsampling ()                             { return false; }
    SDX_API virtual bool SupportsDataModel (FdoRasterDataModel* model)      { return false; }

    //-------------------------------------------------------
    // FdoITopologyCapabilities implementation
    //-------------------------------------------------------

    SDX_API virtual bool SupportsTopology()                                 { return false; }
    SDX_API virtual bool SupportsTopologicalHierarchy()                     { return false; }
    SDX_API virtual bool BreaksCurveCrossingsAutomatically()                { return false; }
    SDX_API virtual bool ActivatesTopologyByArea()                          { return false; }
    SDX_API virtual bool ConstrainsFeatureMovements()                       { return false; }


    //-------------------------------------------------------
    // FdoIGeometryCapabilities implementation
    //-------------------------------------------------------

    SDX_API virtual FdoGeometryType* GetGeometryTypes( FdoInt32& length)
    {
        static FdoGeometryType geomTypes[] = 
        {
                                                                            FdoGeometryType_Point,
                                                                            FdoGeometryType_LineString,
                                                                            FdoGeometryType_Polygon,
                                                                            FdoGeometryType_MultiPoint,
                                                                            FdoGeometryType_MultiLineString,
                                                                            FdoGeometryType_MultiPolygon,
                                                                            FdoGeometryType_MultiGeometry,
                                                                            FdoGeometryType_CurveString,
                                                                            FdoGeometryType_CurvePolygon,
                                                                            FdoGeometryType_MultiCurveString,
                                                                            FdoGeometryType_MultiCurvePolygon
        };

        length = sizeof(geomTypes) / sizeof(FdoGeometryType);
        return geomTypes;
    }
    
    SDX_API virtual FdoGeometryComponentType* GetGeometryComponentTypes( FdoInt32& length )
    {
        static FdoGeometryComponentType compTypes[] = 
        {
                                                                            FdoGeometryComponentType_LinearRing,
                                                                            FdoGeometryComponentType_CircularArcSegment,
                                                                            FdoGeometryComponentType_LineStringSegment,
                                                                            FdoGeometryComponentType_Ring
        };

        length = sizeof(compTypes) / sizeof(FdoGeometryComponentType);
        return compTypes;
    }
    
    SDX_API virtual FdoInt32 GetDimensionalities()
        { 
            return 
                                                                            FdoDimensionality_XY 
                                                                          | FdoDimensionality_Z 
                                                                          | FdoDimensionality_M; 
    }

    //----------------------------------------------------------------------
    //  Bookkeeping code
    //----------------------------------------------------------------------

public:
    
    SdxCapabilities() : m_refCount(1) {}
    SDX_API virtual void Dispose() { delete this; }
    SDX_API virtual FdoInt32 AddRef() { return ++m_refCount; }
    SDX_API virtual FdoInt32 Release() {     
        if (0 == --m_refCount )
            Dispose();
        return m_refCount;
    }
    SDX_API virtual FdoInt32 GetRefCount() { return m_refCount; }


private:

    int m_refCount;

};
