netbuffer.h #1

  • //
  • guest/
  • alan_petersen/
  • piper/
  • mac/
  • R2.0/
  • Perforce/
  • p4api/
  • Headers/
  • netbuffer.h
  • View
  • Commits
  • Open Download .zip Download (5 KB)
/*
 * Copyright 1995, 1996 Perforce Software.  All rights reserved.
 *
 * This file is part of Perforce - the FAST SCM System.
 */

/*
 * netbuffer.h - buffer I/O to transport
 *
 * Classes Defined:
 *
 *	NetBuffer - send/receive buffers for transport
 *
 * Description:
 *
 *	NetBuffer provides a Send/Receive interface, and holds input
 *	and output buffers.  It attempts to avoid buffering if it can
 *	directly pass the caller's data to the transport.
 *
 *	NetBuffer also provides for compressing the link, one half at
 *	a time.
 *
 *	NB: once compression is turned on, it is on for the rest of the
 *	life of the NetBuffer.  Thus the caller should recreate the 
 *	NetBuffer for each connection.
 *
 * Public Methods:
 *
 *	NetBuffer::NetBuffer( NetTransport *t ) - take ownership of t
 *	NetBuffer::SetBufferSizes() - up read/write buffer sizes to himark
 *	NetBuffer::SendCompression() - zlib the send pipe
 *	NetBuffer::RecvCompression() - zlib the recv pipe
 *	NetBuffer::Send() - send block data
 *	NetBuffer::Receive() - receive block data
 *	NetBuffer::Flush() - flush buffered send data
 *	NetBuffer::Close() - close tranport; does not imply Flush()!
 *	NetBuffer::IsAlive() - check for disconnection, clear receive buffer
 *	NetBuffer::GetBuffering() - amount of transport send buffering
 *	NetBuffer::~NetBuffer() - destroy transport; implies Close()
 */

/* 
 * Buffer pointer mumbo jumbo.
 *
 *	Receive buffer:
 *
 *	 done: already passed up via NetBuffer::Receive()
 *	 ready: read from transport, ready for NetBuffer::Receive()
 *	 room: space for transport->Receive()
 *
 *	    recvBuf.Text()
 *	    |                     recvBuf.End()
 *	    |                     |
 *	    ^ done ^ ready ^ room ^
 *	           |       |      |
 *	           |       |      ioPtrs.recvEnd
 *	           |       ioPtrs.recvPtr
 *	           recvPtr
 *
 *	 Send buffer:
 *
 *	     done: already written by transport->Send()
 *	     ready: given to us by NetBuffer::Send, ready for transport
 *	     room: space for NetBuffer::Send
 *
 *	    sendBuf.Text()
 *	    |                     sendBuf.End()
 *	    |                     |
 *	    ^ done ^ ready ^ room ^
 *	           |       |
 *	           |       ioPtrs.sendEnd
 *	           ioPtrs.sendPtr
 */

typedef struct z_stream_s z_stream;

class NetBuffer : public NetTransport {

    public:
			NetBuffer( NetTransport *t );
			~NetBuffer();

	// NetTransport s

	bool		HasAddress()
			{ return transport->HasAddress(); }
	StrPtr *	GetAddress( int raf_flags )
			{ return transport->GetAddress( raf_flags ); }
	StrPtr *	GetPeerAddress( int raf_flags )
			{ return transport->GetPeerAddress( raf_flags ); }
	int		GetPortNum()
	    		{ return transport->GetPortNum(); }
	bool		IsSockIPv6()
	    		{ return transport->IsSockIPv6(); }
	void    	ClientMismatch( Error *e )
			{ if( transport ) transport->ClientMismatch(e); };
	void		DoHandshake( Error *e )
			{ if( transport ) transport->DoHandshake(e); };

	void		Send( const char *buffer, int length, Error *e );
	int		Receive( char *buffer, int length, Error *e );
	virtual bool	IsAccepted()
			{
			    if( transport ) return transport->IsAccepted();
			    else return false;
			}


	void		Flush( Error *e ) { Flush( e, e ); }

	void		Close() 
			{ transport->Close(); }

	int		IsAlive();
	void		SetBreak( KeepAlive *breakCallback )
			{ transport->SetBreak( breakCallback ); }
	int		GetSendBuffering() 
			{ return transport->GetSendBuffering(); }
	int		GetRecvBuffering() 
			{ return transport->GetRecvBuffering(); }
	void            GetEncryptionType(StrBuf &value)
	                { transport->GetEncryptionType( value ); }
	void            GetPeerFingerprint(StrBuf &value)
	                { transport->GetPeerFingerprint( value ); }

	// NetBuffer specials
	// These babies take both send and receive Errors, so 
	// that we can track them separately.  Receive() might do
	// a Flush().  Send() might read data.

	int		Receive( char *buf, int len, Error *re, Error *se );
	void		Send( const char *buf, int len, Error *re, Error *se );
	void		Flush( Error *re, Error *se );

	void		SetBufferSizes( int recvSize, int sendSize );

	void		SendCompression( Error *e );
	void		RecvCompression( Error *e );

	int RecvReady()	{ return ioPtrs.recvPtr - recvPtr; }

    private:


	int RecvDone()	{ return recvPtr - recvBuf.Text(); }
	int RecvRoom() 	{ return ioPtrs.recvEnd - ioPtrs.recvPtr; }
	int SendDone()	{ return ioPtrs.sendPtr - sendBuf.Text(); }
	int SendReady()	{ return ioPtrs.sendEnd - ioPtrs.sendPtr; }
	int SendRoom() 	{ return sendBuf.End() - ioPtrs.sendEnd; }

	void ResetRecv() 
	{
	    recvPtr = recvBuf.Text();
	    ioPtrs.recvPtr = recvBuf.Text();
	    ioPtrs.recvEnd = recvBuf.End();
	}
	
	void ResetSend()
	{
	    ioPtrs.sendPtr = sendBuf.Text();
	    ioPtrs.sendEnd = sendBuf.Text();
	}

	void PackRecv()
	{
	    if( RecvDone() )
	    {
		int l = RecvReady();
		if( l == 0 )
		{
		    recvPtr = ioPtrs.recvPtr = recvBuf.Text();
		}
		else if( !RecvRoom() )
		{
		    memmove( recvBuf.Text(), recvPtr, l );
		    recvPtr = recvBuf.Text();
		    ioPtrs.recvPtr = recvBuf.Text() + l;
		}
	    }
	}

	void PackSend()
	{
	    if( !SendReady() )
	    {
		ResetSend();
	    }
	    else if( !SendRoom() && SendDone() )
	    {
		int l = SendReady();
		memmove( sendBuf.Text(), ioPtrs.sendPtr, l );
		ioPtrs.sendPtr = sendBuf.Text();
		ioPtrs.sendEnd = sendBuf.Text() + l;
	    }
	}

	// Buffer data.
	NetTransport	*transport;
	char		*recvPtr;
	NetIoPtrs	ioPtrs;

	StrBuf		sendBuf;
	StrBuf		recvBuf;

	// For compression

	int		compressing;
	z_stream	*zin;
	z_stream	*zout;

} ;
# Change User Description Committed
#1 15071 alan_petersen Populate -o //guest/perforce_software/piper/...
//guest/alan_petersen/piper/....
//guest/perforce_software/piper/mac/R2.0/Perforce/p4api/Headers/netbuffer.h
#2 13626 alan_petersen Copying using piper_mac_main2r2.0
#1 12962 alan_petersen Populate -o //guest/perforce_software/piper/mac/main/...
//guest/perforce_software/piper/mac/R2.0/....
//guest/perforce_software/piper/mac/main/Perforce/p4api/Headers/netbuffer.h
#1 12961 alan_petersen Piper 2.0 Mega Update

New Features/Functionality
- Added help menu redirecting to URL.
- Added readonly property for creating new workspaces.
- Added html hyperlinks for Copy link functionality.
- Added functionality for managing Finder Favorite items in sidebar.
- Redesigned the way mapping is stored in Piper.
- First version of syncing finder sidebar items with workspace mapping.
- Small sorting improvements.
- Creating Projects directory inside users home folder.
- Adding Projects folder to finder sidebar item.
- Creating and removing symbolic links accordingly to mapped folders.
- Preventing duplicate names in symbolic links.
- Refreshing symbolic links on mapping change inside application.
- Storing workspace and server details in p4 configuration for other applications to use.
- Added contextual menu items for Finder integration.
- Added services menu for Adobe Illustrator integration.
- Keyboard shortcuts for Illustrator integration.
- Code refactoring and fixes for mapping issues.
- Added Finder functionality to edit all files in folder.
- Added user friendly message when editing a file using Finder outside the workspace.
- Implemented hidden automatic login when opening application using Finder integration.
- Logging to file in ~/Library/Logs
- Unified workspace and all files views to show both local and depot files and folders.
- Removed my workspace view references and logic.
- Editing unmapped files on server.
- First version of adding file to unmapped folders.
- Showing opened by and edit actions in column details for all depot files.
- Improved mappings functionality.
- Enabled same feature options for mapped and unmapped folders and files.
- Redesigned from scratch mapping and unmapping procedures for adding and removing files.
- Implemented cleaning workspace using new mapping functionality. Removed debug overlay coloring.
- Automated workspace creation
- Improvements in editing files already mapped to workspace.
- Implemented deleting remote files.
- Implemented first version of move operation for remote files.
- Removing last workspace information when disconnecting from workspace using app menu.
- Implemented editing and submitting using symbolic links in project folder. New finder menu service for symbolic links Show in Piper which acts like share link functionality.
- New icons for files and folders not tracked in the filesystem.
- Improvements in showing file using share link.
- Switched to new way of retrieving files in order to show user changes.
- Redesigned and implemented new functionality for chaining operations with mapping.
- Improvements and redesign of Edit/add actions to use new chaining logic . Fixed issue with file edit.
- Improvements in window showing when using services.
- Simplified file loading so the local files appears only when remote are also loaded.
- Improved deleting of untracked files to avoid mapping and marking for delete.
- Enabling simple copy paste and moving of remote and local files.
- Added abort for exception handling in order to force crashing application on critical failures
- Added custom exception handling for catching runtime errors to log and crash instead of continuing in unstable state.
- Changed file copying to use mark for add .
- Simplified and fixed responding file representations to mapping changes.

Bug Fixes
- Fixed crash when synchronizing.
- Fixed sync issue when downloading directory without file size information.
- Fixed issue with unread list crashing when file is not existing on disk.
- Fixed incorrect sync progress calculation.
- Removed relative path issues.
- Fixed many of case-sensitivity problems.
- Fixed deprecated methods and related issues in OS X 10.10.
- Fixed folder rename not updating in column view. Revised and fixed many potential problems from implicit casting.
- Fixed missing sync button on fast sync completion.
- Refreshing mapping on synchronization. Fixed symbolic links not appearing until app is restarted.
- Fixed latest crashing of autosync.
- Fixed loading indicator issues.
- Fixed and redesigned submit dialog to work correctly with Submit All Files option in Finder.
- Fixed multiple error messages on network outage. Redesigned showing errors in main window.
- Fixed opening random locations when using Finder integration.
- Fixed issue when panel was detached from parent window.
- Fixed bug when creating new workspace wouldn't store default settings.
- Fixed memory issues with network operations.
- Fixes in relogging mappings and file listing.
- Improvements in editing unmapped files.
- Fixed crash when adding file outside workspace.
- Fixed breadcrumbs control issue.
- Fixed issue with double parent folders when opening unmapped files.
- Fixed crashes on sync after mapping new files.
- Fixed issue with editing file using Finder
-- Merging code and additional fixes in add button functionality.
- Fixed unsync not working
- Fixed submit panel issue not selecting files with different name case.
- Fixed missing revert and sync to workspace actions in some cases.
- Fixed issue with Submit and Edit finder actions. Improvements in stability of finder integration.
- Fixed issue with unsubmitted folders breaking status of files inside.
- Fixed issue with added files not showing correct icon and status.
- Fixed bug with file edit resulting in a new directory named exactly like a file.
- Fixed issue with reloading of subpath resulting in untracked folders.
- Fixed mapping issue when result was always view mapping not relative.
- Fixed submit panel showing more than once.
- Fixed illustrator services not working.
- Fixed userdefaults preferences problem with workspace name being null.
- Fixed userdefaults keypath problem of dot-containing workspace names.
- Forcing recreating of browser to possibly prevent pre-10.10 errors with automatic workspace selection.
- Fixed adding file to depot not presenting correct icon.
- Fixed issues with reverting a file that was marked for add.
- Presenting error when trying to submit untracked files.
- Fixed issue when submit files service crashed when using unmapped files.
- Fixed file representation disappearing when removing file.
- Fixed issue with symlinks resolving working on 10.10 only. Issue related to workspace selection not showing.
- Fixed error panel method calls unavailable in Mac OS versions before 10.10. Issue related to hanging error panels.
- Fixed removing a local file resulting in action progress freezing.
- Fixed open file not working after edit.
- Fixing crash when mapping changed. Issue related to moving local file to unmapped folder and other similar cases.