/* * Copyright 1995, 1998 Perforce Software. * * This file is part of WebKeeper, a perforce client apache module. * * License is hereby granted to use this software and distribute it * freely, as long as this copyright notice is retained and modifications * are clearly marked. * * ALL WARRANTIES ARE HEREBY DISCLAIMED. * * $Id: //public/perforce/webkeeper/mod_webkeep2.cc#2 $ */ /* * mod_webkeep2.cc -- C++ glue between webkeeper and Perforce Client API * * ClientUserWK sits upon the Perforce ClientApi, and webKeepPrint() * makes use of ClientUserWK. The web server Apache module mod_webkeep.c * interfaces to webKeepPrint() through webkeep.h. */ # include <clientapi.h> extern "C" { # include "mod_webkeep.h" } class ClientUserWK : public ClientUser { public: void OutputInfo( char level, char *data ) { if( sync ) return; int l = strlen( data ); int isBinary = l > 5 && strcmp( data + l - 5, "text)" ); (*printer->data)( printer, isBinary ); } void OutputError( char *errBuf ) { (*printer->error)( printer, errBuf ); } void OutputText( char *data, int length ) { (*printer->text)( printer, data, length ); } void OutputBinary( char *data, int length ) { (*printer->text)( printer, data, length ); } WebKeepPrinter *printer; int sync; } ; extern "C" void webKeepPrint( WebKeepConnect *p4, char *path, WebKeepPrinter *printer ) { Error e[1]; ClientUserWK ui; ClientApi client( &ui ); // Plug in API extentions: user's closure parameter and // dispatch table. ui.printer = printer; if( p4->port ) client.SetPort( p4->port ); if( p4->user ) client.SetUser( p4->user ); if( p4->pass ) client.SetPassword( p4->pass ); if( p4->client ) client.SetClient( p4->client ); if( p4->sync ) ui.sync = 1; // Connect. client.Init( e ); if( !e->Test() ) { client.SetArgv( 1, &path ); client.Run( "print" ); client.Final( e ); } if( e->Test() ) { StrBuf buf; e->Fmt( &buf ); (*printer->error)( printer, buf.Text() ); } } extern "C" void webKeepSync( WebKeepConnect *p4, char *path, WebKeepPrinter *printer ) { Error e[1]; ClientUserWK ui; ClientApi client( &ui ); ui.printer = printer; if( p4->port ) client.SetPort( p4->port ); if( p4->user ) client.SetUser( p4->user ); if( p4->pass ) client.SetPassword( p4->pass ); if( p4->client ) client.SetClient( p4->client ); if( p4->sync ) ui.sync = 1; // Connect. client.Init( e ); if( !e->Test() ) { client.SetArgv( 1, &path ); client.Run( "sync" ); client.Final( e ); } if( e->Test() ) { StrBuf buf; e->Fmt( &buf ); (*printer->error)( printer, buf.Text() ); } } class ClientUserFileExists : public ClientUser { public: ClientUserFileExists() { fexists = 0; } void OutputInfo( char, char * ) { fexists = 1; } void OutputError( char * ) { fexists = 0; } void OutputText( char *, int ) {} void OutputBinary( char *, int ) {} int FileExists() { return fexists; } private: int fexists; }; extern "C" int webKeepFileExists( WebKeepConnect *p4, char *path ) { Error e[1]; ClientUserFileExists ui; ClientApi client( &ui ); if( p4->port ) client.SetPort( p4->port ); if( p4->user ) client.SetUser( p4->user ); if( p4->pass ) client.SetPassword( p4->pass ); if( p4->client ) client.SetClient( p4->client ); client.Init( e ); if( !e->Test() ) { client.SetArgv( 1, &path ); client.Run( "files" ); client.Final( e ); } return ui.FileExists(); } extern "C" int webKeepDirExists( WebKeepConnect *p4, char *path ) { Error e[1]; ClientUserFileExists ui; ClientApi client( &ui ); if( p4->port ) client.SetPort( p4->port ); if( p4->user ) client.SetUser( p4->user ); if( p4->pass ) client.SetPassword( p4->pass ); if( p4->client ) client.SetClient( p4->client ); client.Init( e ); if( !e->Test() ) { int length = strlen( path ); int endsInSlash = ( path[length - 1] == '/' ); /* * Since we don't have access to the Apache pool here, we will * just blank the slash out and restore it when we're done. */ if( endsInSlash ) { path[length - 1] = '\0'; } client.SetArgv( 1, &path ); client.Run( "dirs" ); client.Final( e ); if( endsInSlash ) { path[length - 1] = '/'; } } return ui.FileExists(); }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#3 | 803 | Stephen Vance |
Update to Apache 1.3 API. Eliminate compilation warning. Add WebKeepDirectoryIndex. |
||
#2 | 766 | Stephen Vance | Add WebKeepSync to configuration directives, allowing a local workspace to be sync'ed based on the web request and letting the normal Apache mechanisms do the rest. | ||
#1 | 603 | Stephen Vance |
First public checkin of Webkeeper updated for Apache 1.3.X. Tested on FreeBSD 3.5 and Red Hat Linux 6.2 and 7.0. |