Several online file services exist for storing, and
      sharing, files on the internet. Each one provides an API which allows
      programs to communicate with the service. Unfortunately each API is
      different making it difficult for desktop programs to easily support them.
      
      The NetDrive class (and related derived classes) implements each API and
      therefore exposes the various services using a common class interface.
      This makes using any of the services from Clarion program easy.
      
      Because of the common interface it's also easier to switch from one
      service to another service as the needs of the client require.
      
      Currently the services supported are;
      
        - Dropbox
- Microsoft OneDrive
- Google Drive
      All these drive services make use of OAuth User logins, so this class is
      related to the 
NetOAuth class. This
      document starts by assuming that the program has an appropriate 
OAuthLogin
      procedure 
    
 All the cloud drive services require OAuth 2
      authentication. This means that the 
OAUTH
        Requirements for OAuth 2 apply to NetDrive as well. Cryptonite is
      only needed for OAuth1, so is not required for NetDrive.
      
      All the cloud services make use of JSON to communicate between your
      program and the server. So 
 jFiles is required for most NetDrive functionality.
      
      DropBox and OneDrive allow for in-program HTML controls to do the login,
      and so for these services 
ChromeExplorer is recommended (but not required.)
      Google requires that the Google login occur via an external browser which
      is called from the program.
      
    
      The NetDrive classes create a common set of functions across all the drive
      services, so implementing cloud file storage is easy regardless of
      which service you prefer.
      
      The following features are supported by the class;
      
     Cloud file services are very similar to local hard
      drives in the way they work, and in how they name things. However there
      are a few differences which matter, so the things you need to know are
      listed here;
      
      Slashes
       In web services folders are separated by a forward
        slash character (/) rather than the window backslash (\) character.
        Methods will correct \ to / when it is used, but it should be noted that
        file names containing either slash are not allowed.
      File and Folder IDs
       In addition to the Name each Folder or File has an
        ID. In some systems the ID is the unique identifier NOT the name. Some
        systems allow for multiple files, in the same folder, with the same name
        (with a different ID). 
        
        Most methods accept both a Name and an ID. When using these methods it
        is recommended that both fields are provided - this will ensure maximum
        compatibility, and performance, with all services. 
        
        There is no concept of a Current Folder. All folder and field names are
        expected to be fully qualified (ie containing the full path name and
        file name.)
      Commands
       All commands (
Directory, 
 UploadFile etc) are asynchronous. This means
        they happen in the background. When a command completed then the 
Done
        method is called.
        
        If a command is called and the object is already busy then the command
        is added to a queue, and it waits there until the object is available.
        This allows the programmer to generated multiple commands without having
        to wait for a command to be finished.
        
        Each command is assigned a unique command ID. When the command is
        complete then the Done method is called and the same command number is
        loaded into the CommandID field. This allows the calling procedure to
        track which command is being Done. It should be noted that commands may
        be generated internally by the class so either the command ID or the
        Command property should be checked before executing code in the Done
        method.
      
      
      NetDriveDropbox / NetDriveGoogle /
        NetDriveMicrosoft
       Included in NetTalk
          Desktop
        
        All the NetDrive classes derive from the _NetDrive class. They contain
        no additional properties, and merely flesh out the methods as described
        by the _NetDrive class depending on the specific code required by the
        service they are for. For more information on the properties and methods
        available to these classes see the documentation for 
_NetDrive
        below.
 
      _NetDrive
       Included in NetTalk
          Desktop
        Derivation
        
          
            - NetDriveDropBox / NetDriveGoogle / NetDriveMicrosoft  ( NetDrive.Inc / NetDrive.Clw )
              
                - _NetDrive ( NetDrive.Inc /
                    NetDrive.Clw )
                  
                
 
 
        Properties
        
          
            
              
                | Property | Description | 
              
                | Command (string 20)
 | The current command being processed. | 
              
                | CommandBusy (Long)
 | If set to true then the class is busy processing a command. | 
              
                | CommandID (Long)
 | The ID of the command that just completed. The ID is
                  returned by all the methods that initiate a command. | 
              
                | CommandQueue (NetDriveCommandQueueType)
 | A list of command waiting to be processed by the class. | 
              
                | DirectoryQueue (NetDriveDirectoryQueueType)
 | Holds the results of a call to the Directory method. | 
              
                | OAuthParms | An 
                    AuthParametersGroup provided by a call to OAuthLogin. | 
              
                | ProgressControl | The Field Equate (FEQ) of a Progress Control on the window.
                  This allows the class to provide visual feedback to the user
                  as commands execute. Can be left unset. | 
            
          
         
        Methods
        
       
      CreateFolder
       CreateFolder
          (String pFolderName, String pParentId)
        
        Description
        
        Creates a folder in the cloud drive.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pFolderName | The name of the new folder to create. This should be relative
                to root. For example if you wanted to make a red
                folder in the themes folder then this should be
                \themes\red. | 
            
              | pParentId | The ID of the existing folder into which the new folder must
                go. If left blank then the folder is added to the root folder.
                To get the ID of a folder (not used by OneDrive or Dropbox)
 | 
          
        
        
        Notes
        
        If the folder already exists then no action will occur. The Done method
        will be called as normal, and the CommandResult value will be set to 
net:FolderAlreadyExists.
        
        DropBox does not use the ParentId parameter, however it is a good idea
        to supply it anyway to ensure code consistency across all the services.
        
        
Return Value
        
        The method returns the command ID number. This will match the number in
        the CommandID property when the 
Done method is
        called.
        
        
See Also
        
        DeleteFolder, 
Done
        
       
      DeleteFile
       DeleteFile (String
          pRemoteFile, String pFileId)
        
        Description
        
        This allows you to delete a file in the service. Pass in the full
        pathname of the remote file, as well as the file ID.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pRemoteFile | The full pathname to the remote file to delete. | 
            
              | pFileId | The ID of the file to delete. (not used by OneDrive or Dropbox)
 | 
          
        
        
        Notes
        
        Some systems use the ID, others use the filename. For consistency pass
        both in.
        
        
Return Value
        
        The method returns the command ID number. This will match the number in
        the CommandID property when the 
Done method is
        called.
        
        
See Also
        
        DeleteFolder, 
CreateFolder,
        
 UploadFile, 
Done
        
       
      DeleteFolder
       DeleteFolder
          (String pFolderName, String pFolderId)
        
        Description
        
        This method is called after a request to the service completes. The 
Command property contains the name of the
        command which has just completed.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pFolderFile | The full pathname to the remote folder to delete. | 
            
              | pFolderId | The ID of the folder to delete. (not used by OneDrive or Dropbox)
 | 
          
        
        
        Return Value
        
        The method returns the command ID number. This will match the number in
        the CommandID property when the 
Done method is
        called.
        
        
See Also
        
        DeleteFile, 
          CreateFolder, 
Done
        
       
      Directory
       Directory (String
          pFolderName, String pFolderId)
        
        Description
        
        This method is called to get a directory listing.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pFolderName | The full pathname of the remote folder. If the root folder is
                to be listed then this parameter should be left blank. | 
            
              | pFolderId | The ID of the folder. If the root folder is to be listed then
                this parameter should be left blank. (not used by OneDrive or Dropbox)
 | 
          
        
        
        Return Value
        
        The method returns the command ID number. This will match the number in
        the CommandID property when the 
Done method is
        called.
        
        
See Also
        
        Done
        
       
      Done
       Done ()
        
        Description
        
        This method is called after a request to the service completes. The 
Command property contains the name of the
        command which has just completed. The 
CommandID
        property contains the ID of the command that just completed.
        
        
Notes
        
        You may need to embed code here if you wish to do something with the
        results of the command. For example the following code looks for a
        completed directory command, and copies specific details from the 
          DirectoryQueue property to a local queue (for displaying on the
        screen.) Also in this example, for all other commands a call to
        Directory is made to refresh the listing.
        
        
case drive.Command
          of 'directory' 
            free(FilesQ)
            loop x = 1 to records(drive.DirectoryQueue)
              get(drive.DirectoryQueue,x)
              FilesQ :=: drive.DirectoryQueue
              if FQ:Attrib = ff_:DIRECTORY then FQ:Icon = 2 else
          FQ:Icon = 1.
              Add(FilesQ)
            end
            display()
          else
            post(EVENT:Accepted,?DirectoryButton)
          end
         
        Return Value
        
        The method returns nothing.
        
        
See Also
        
        
        
       
      DownloadFile
       DownloadFile(String
          pRemoteFile, String pRemoteID, String pLocalFile)
        
        Description
        
        This method allows you to download a file from the cloud to the local
        machine
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pRemoteFile | The full path and filename of the remote file. | 
            
              | pRemoteID | The ID of the file. (not used by OneDrive or Dropbox)
 | 
            
              | pLocalFile | The fully qualified path name and file name for the local copy
                of the file. If the path is not included then the current folder
                will be used. | 
          
        
        
        Return Value
        
        The method returns the command ID number. This will match the number in
        the CommandID property when the 
Done method is
        called.
        
        
See Also
        
        UploadFile, 
Done
        
       
      SetProgress
       SetProgress (Long
          pProgress)
        
        Description
        
        Sets the Progress Control Value (if the control exists) to the passed
        parameter. This method is usually called directly by the class, and does
        not need to be called by the program. 
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pProgress | A value from 1 to 100 that sets the current position of the
                progress bar. | 
          
        
        
        Notes
        
        Progress is set to 5 when a command commences. It is set to 95 when the
        response is received from the server. It is set to 100 in the 
Done
          method. Most commands are very fast between 5 and and 95,
        however uploads and downloads can take some time to cover this range. 
        
        
Return Value
        
        The method returns nothing.
        
        
See Also
        
        
        
       
      UploadFile
       UploadFile (String
          pLocalFileName, String pRemoteFileName, String pRemoteFolderId, Byte
          pOverwrite)
        
        Description
        
        This method uploads a local file to the remote service.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pLocalFileName | the fully qualified path name of the local file. | 
            
              | pRemoteFileName | The fully qualified path name of the file as it will appear on
                the remote service. | 
            
              | pRemoteFolderId | The ID of the remote folder that this file will go into. (not used by OneDrive or Dropbox)
 | 
            
              | pOverwrite | If  net:Overwrite then the file
                will overwrite the existing file, if it already exists. If net:PreserveOriginal  then the
                upload will fail if the file already exists.
 | 
          
        
        
        Return Value
        
        The method returns the command ID number. This will match the number in
        the 
CommandID property when the 
Done
        method is called.
        
        
See Also
        
        DownloadFile, 
Done
        
       
      UserLogin
       UserLogin (Long
          pForce=false)
        
        Description
        
        This method is called when the login to the service has expired. 
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pForce | If true then  a new access token is requested, even if a
                token already exists. | 
          
        
        
        Notes
        
        You will need to embed code here to set some of the OAuthParms fields,
        and also to call the OAuthLogin procedure.
        For example;
        
        
        
ReturnValue =
          PARENT.UserLogin(pForce)         
         
          self.OAuthParms.pClientId = 'xxxxxxxxxxxxxx'    
        self.OAuthParms.pClientSecret =
          'xxxxxxxxxxxxx'  ReturnValue =
          OAuthLogin(self.OAuthParms)       
        
         
        Return Value
        
        The method returns a Long, which is the result from calling the 
          OAuthLogin procedure.
        
        
See Also
        
         OAuthParametersGroup,
        
OAuthLogin procedure,