Performing file I/O
The default client file I/O implementation returns a
FileSys object, which is described in
filesys.h. To intercept client workspace file I/O, replace
the FileSys *ClientUser::File() method
by subclassing ClientUser.
The following example illustrates how you can override
FileSys.
#include "p4/clientapi.h"
class MyFileSys : public FileSys {
public:
MyFileSys();
~MyFileSys();
virtual void Open( FileOpenMode mode, Error *e );
virtual void Write( const char *buf, int len, Error *e );
virtual int Read( char *buf, int len, Error *e );
virtual int ReadLine( StrBuf *buf, Error *e );
virtual void Close( Error *e );
virtual int Stat();
virtual int StatModTime();
virtual void Truncate( Error *e );
virtual void Unlink( Error *e = 0 );
virtual void Rename( FileSys *target, Error *e );
virtual void Chmod( FilePerm perms, Error *e );
protected:
int nchars;
} ;
MyFileSys::MyFileSys()
{
nchars = 0;
}
MyFileSys::~MyFileSys()
{
printf( "Number of characters transferred = %d\n", nchars );
}
void MyFileSys::Open( FileOpenMode mode, Error *e )
{
printf( "In MyFileSys::Open()\n" );
}
void MyFileSys::Write( const char *buf, int len, Error *e )
{
printf( "In MyFileSys::Write()\n" );
printf( "%s", buf );
nchars = nchars + len;
}
int MyFileSys::Read( char *buf, int len, Error *e )
{
printf( "In MyFileSys::Read()\n" );
return 0;
}
int MyFileSys::ReadLine( StrBuf *buf, Error *e )
{
printf( "In MyFileSys::ReadLine()\n" );
return 0;
}
void MyFileSys::Close( Error *e )
{
printf( "In MyFileSys::Close()\n" );
}
int MyFileSys::Stat()
{
printf( "In MyFileSys::Stat()\n" );
return 0;
}
int MyFileSys::StatModTime()
{
printf( "In MyFileSys::StatModTime()\n" );
return 0;
}
void MyFileSys::Truncate( Error *e )
{
printf( "In MyFileSys::Truncate()\n" );
}
void MyFileSys::Unlink( Error *e = 0 )
{
printf( "In MyFileSys::Unlink()\n" );
}
void MyFileSys::Rename( FileSys *target, Error *e )
{
printf( "In MyFileSys::Rename()\n" );
}
void MyFileSys::Chmod( FilePerm perms, Error *e )
{
printf( "In MyFileSys::Chmod()\n" );
}
class ClientUserSubclass : public ClientUser {
public:
virtual FileSys *File( FileSysType type );
};
FileSys *ClientUserSubclass::File( FileSysType type )
{
return new MyFileSys;
}
int main( int argc, char **argv )
{
ClientUserSubclass ui;
ClientApi client;
Error e;
char force[] = "-f";
char file[] = "hello.c";
char *args[2] = { &force[0], &file[0] };
// Connect to server
client.Init( &e );
e.Abort();
// Run the command "sync -f hello.c"
client.SetArgv( 2, &args[0] );
client.Run( "sync", &ui );
// Close connection
client.Final( &e );
e.Abort();
return 0;
}
The preceding program produces the following output when you run it.
% ls -l hello.c
-r--r--r-- 1 member team 41 Jul 30 16:57 hello.c
% cat hello.c
main()
{
printf( "Hello World!\n" );
}
% samplefilesys
//depot/main/hello.c#1 - refreshing /work/main/hello.c
In MyFileSys::Stat()
In MyFileSys::Open()
In MyFileSys::Write()
main()
{
printf( "Hello World!\n" );
}
In MyFileSys::Close()
Number of characters transferred = 41






