// ClientDepotUser.cpp: interface and implementation of the ClientDepotUser class.
//
/////////////////////////////////////////////////////////////////////////////////


//this I/O class is designed to be used in conjunction with the commands "p4 depots" and "p4 depot -o" ONLY.


#include "clientdepotuser.h"

/* This function is the one that gets called by Perforce - by default, it handles the
 * "p4 depots" case, but if specflag is set it calls OutputSpec() instead. */
void
ClientDepotUser::OutputInfo( char level, const_char *data )
{
	if (results > MAXRESULTS) return; //If we have >MAXRESULTS depots, don't add any more!
	if (specflag == TRUE) //Is this a depot spec we're looking at?  If so, this flag should be set.
	{
		OutputSpec(data); //Assume that "p4 depot -o" was called and act accordingly.
		return;
	}
	/* If we've reached this point we should be looking at a line of output from "p4 depots".  It should
	 * look sort of like this:
	 * Depot mydepot 1999/07/15 local subdir mydepot/... 'Created by samwise. '
	 * The only thing we care about is the depot name, which starts on the six character of the line,
	 * and is followed by a space. */
	StrBuf depot = StrBuf(); //We're going to hold the depot name in a StrBuf.
	char* ptr = data+6; //This pointer is now pointing at the first letter of the depot name.
	while (*ptr != ' ') //Until we hit a space:
	{
		depot.Append(ptr, 1); //Add this character to the StrBuf.
		ptr++; //and increment the pointer to the next character.
	}
	/* All done - the StrBuf now holds the name of the depot. */
	depots.Append(depot); //Add it to the list.
	results++; //Increment this counter so we'll know if we exceed MAXRESULTS.
}

/* This function is pretty simple - it just dumps the spec into the "spec" StrBuf.
 * Comments aren't that important, so we omit those lines. */
void
ClientDepotUser::OutputSpec( const_char *data)
{
	char* ptr = data;
	while (*ptr == '#') {  //This loop just skips over any lines beginning with '#'.
		while (*ptr != '\n') {
			ptr++;
		}
		ptr++;
	}
	/* After this point, the pointer is looking at the first relevant character.*/
	spec.Append((const char*) ptr); //Poink.  All done.
}

ClientDepotUser::ClientDepotUser()
{
	results = 0;
}

ClientDepotUser::~ClientDepotUser()
{

}
