[SCM-867] fix ScmWagon has no way to work with CVS in binary mode (#65)

* [SCM-867] fix ScmProvider.add() ignores explicit binary mode

* [SCM-867] fix ScmProvider.checkOut() overload ignores explicit scmVer

* [SCM-867] cvs checkout in binary mode when requested
diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/provider/AbstractScmProvider.java b/maven-scm-api/src/main/java/org/apache/maven/scm/provider/AbstractScmProvider.java
index e0dfb41..dfcc88d 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/provider/AbstractScmProvider.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/provider/AbstractScmProvider.java
@@ -167,9 +167,12 @@
     {
         login( repository, fileSet );
 
-        // TODO: binary may be dependant on particular files though
-        // TODO: set boolean?
-        parameters.setString( CommandParameter.BINARY, "false" );
+        if ( parameters.getString( CommandParameter.BINARY , null ) == null )
+        {
+            // TODO: binary may be dependant on particular files though
+            // TODO: set boolean?
+            parameters.setString( CommandParameter.BINARY, "false" );
+        }
 
         return add( repository.getProviderRepository(), fileSet, parameters );
     }
@@ -503,6 +506,10 @@
         throws ScmException
     {
         login( repository, fileSet );
+        if ( scmVersion != null && commandParameters.getScmVersion( CommandParameter.SCM_VERSION, null ) == null )
+        {
+            commandParameters.setScmVersion( CommandParameter.SCM_VERSION, scmVersion );
+        }
 
         return checkout( repository.getProviderRepository(), fileSet, commandParameters );
     }
diff --git a/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/checkout/AbstractCvsCheckOutCommand.java b/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/checkout/AbstractCvsCheckOutCommand.java
index e47b31d..24df188 100644
--- a/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/checkout/AbstractCvsCheckOutCommand.java
+++ b/maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/command/checkout/AbstractCvsCheckOutCommand.java
@@ -19,8 +19,11 @@
  * under the License.
  */
 
+import org.apache.maven.scm.CommandParameter;
+import org.apache.maven.scm.CommandParameters;
 import org.apache.maven.scm.ScmException;
 import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
 import org.apache.maven.scm.ScmVersion;
 import org.apache.maven.scm.command.checkout.AbstractCheckOutCommand;
 import org.apache.maven.scm.command.checkout.CheckOutScmResult;
@@ -43,11 +46,28 @@
     extends AbstractCheckOutCommand
     implements CvsCommand
 {
-    /** {@inheritDoc} */
+
+    /**
+     * The overriden {@link #executeCommand(ScmProviderRepository, ScmFileSet, CommandParameters)}
+     * in this class will not call this method!
+     * <p>
+     * {@inheritDoc}
+     */
     protected CheckOutScmResult executeCheckOutCommand( ScmProviderRepository repo, ScmFileSet fileSet,
                                                        ScmVersion version, boolean recursive, boolean shallow )
         throws ScmException
     {
+        throw new UnsupportedOperationException( "Should not get here" );
+    }
+
+    @Override
+    public ScmResult executeCommand( ScmProviderRepository repo, ScmFileSet fileSet,
+                                     CommandParameters parameters )
+        throws ScmException
+    {
+        ScmVersion version = parameters.getScmVersion( CommandParameter.SCM_VERSION, null );
+        boolean binary = parameters.getBoolean( CommandParameter.BINARY, false );
+
         if ( fileSet.getBasedir().exists() )
         {
             try
@@ -69,6 +89,11 @@
 
         cl.setWorkingDirectory( fileSet.getBasedir().getParentFile().getAbsolutePath() );
 
+        if ( binary )
+        {
+            cl.createArg().setValue( "-kb" );
+        }
+
         if ( version != null && !StringUtils.isEmpty( version.getName() ) )
         {
             cl.createArg().setValue( "-r" );