#
# backup protocol definition
#

Name 				Backup
IdentString			Box-Backup:v=C
ServerContextClass	BackupStoreContext	BackupStoreContext.h

AddType		Filename	BackupStoreFilenameClear	BackupStoreFilenameClear.h
AddType		String		std::string

ImplementLog	Server	syslog
ImplementLog	Client	syslog
ImplementLog	Client	file

LogTypeToText	Filename	"%s"	VAR.GetClearFilenameIfPossible("OPAQUE").c_str()

BEGIN_OBJECTS

# -------------------------------------------------------------------------------------
#  Session commands
# -------------------------------------------------------------------------------------

Error		0	IsError(Type,SubType)	Reply
	int32		Type
	int32		SubType
	CONSTANT	ErrorType						1000
	CONSTANT	Err_WrongVersion				1
	CONSTANT	Err_NotInRightProtocolPhase		2
	CONSTANT	Err_BadLogin					3
	CONSTANT	Err_CannotLockStoreForWriting	4
	CONSTANT	Err_SessionReadOnly				5
	CONSTANT	Err_FileDoesNotVerify			6
	CONSTANT	Err_DoesNotExist				7
	CONSTANT	Err_DirectoryAlreadyExists		8
	CONSTANT	Err_CannotDeleteRoot			9
	CONSTANT	Err_TargetNameExists			10
	CONSTANT	Err_StorageLimitExceeded		11
	CONSTANT	Err_DiffFromFileDoesNotExist	12
	CONSTANT	Err_DoesNotExistInDirectory		13
	CONSTANT	Err_PatchConsistencyError		14
	CONSTANT	Err_MultiplyReferencedObject		15
	CONSTANT	Err_DisabledAccount				16

Version		1	Command(Version)	Reply
	int32	Version


Login		2	Command(LoginConfirmed)
	int32		ClientID
	int32		Flags
	CONSTANT	Flags_ReadOnly	1


LoginConfirmed	3	Reply
	int64		ClientStoreMarker
	int64		BlocksUsed
	int64		BlocksSoftLimit
	int64		BlocksHardLimit


Finished	4	Command(Finished)	Reply	EndsConversation


# generic success object
Success		5	Reply
	int64		ObjectID


SetClientStoreMarker	6	Command(Success)
	int64		ClientStoreMarker


# -------------------------------------------------------------------------------------
#  Generic object commands
# -------------------------------------------------------------------------------------

GetObject	10	Command(Success)
	int64		ObjectID
	# reply has stream following (if successful)


MoveObject	11	Command(Success)
	int64		ObjectID
	int64		MoveFromDirectory
	int64		MoveToDirectory
	int32		Flags
	Filename	NewFilename
	
	CONSTANT Flags_MoveAllWithSameName			1
	CONSTANT Flags_AllowMoveOverDeletedObject	2

# consider this an object command as, although it deals with directory entries,
# it's not specific to either a file or a directory


GetObjectName	12	Command(ObjectName)
	int64		ObjectID
	int64		ContainingDirectoryID
	CONSTANT	ObjectID_DirectoryOnly	0

	# set ObjectID to ObjectID_DirectoryOnly to only get info on the directory


ObjectName		13	Reply
	int32		NumNameElements
	int64		ModificationTime
	int64		AttributesHash
	int16		Flags
	# NumNameElements is zero if the object doesn't exist
	CONSTANT	NumNameElements_ObjectDoesntExist	0
	# a stream of Filename objects follows, if and only if NumNameElements > 0


# -------------------------------------------------------------------------------------
#  Directory commands
# -------------------------------------------------------------------------------------

CreateDirectory	20	Command(Success)	StreamWithCommand
	int64		ContainingDirectoryID
	int64		AttributesModTime
	Filename	DirectoryName
	# stream following containing attributes


CreateDirectory2	46	Command(Success)	StreamWithCommand
	int64		ContainingDirectoryID
	int64		AttributesModTime
	int64		ModificationTime
	Filename	DirectoryName
	# stream following containing attributes


ListDirectory	21	Command(Success)
	int64		ObjectID
	int16		FlagsMustBeSet
	int16		FlagsNotToBeSet
	bool		SendAttributes
	# make sure these flags are synced with those in BackupStoreDirectory
	CONSTANT	Flags_INCLUDE_EVERYTHING 	-1
	CONSTANT	Flags_EXCLUDE_NOTHING 		0
	CONSTANT	Flags_EXCLUDE_EVERYTHING	15
	CONSTANT	Flags_File			1
	CONSTANT	Flags_Dir			2
	CONSTANT	Flags_Deleted			4
	CONSTANT	Flags_OldVersion		8
	# make sure this is the same as in BackupStoreConstants.h
	CONSTANT	RootDirectory			1

	# reply has stream following Success object, containing a stored BackupStoreDirectory


ChangeDirAttributes	22	Command(Success)	StreamWithCommand
	int64		ObjectID
	int64		AttributesModTime
	# stream following containing attributes


DeleteDirectory	23	Command(Success)
	int64		ObjectID


UndeleteDirectory	24	Command(Success)
	int64		ObjectID
	# may not have exactly the desired effect if files within in have been deleted before the directory was deleted.


# -------------------------------------------------------------------------------------
#  File commands
# -------------------------------------------------------------------------------------

StoreFile	30	Command(Success)	StreamWithCommand
	int64		DirectoryObjectID
	int64		ModificationTime
	int64		AttributesHash
	int64		DiffFromFileID		# 0 if the file is not a diff
	Filename	Filename
	# then send a stream containing the encoded file


GetFile		31	Command(Success)
	int64		InDirectory
	int64		ObjectID
	# error returned if not a file, or does not exist
	# reply has stream following, containing an encoded file IN STREAM ORDER
	# (use GetObject to get it in file order)


SetReplacementFileAttributes	32	Command(Success)	StreamWithCommand
	int64		InDirectory
	int64		AttributesHash
	Filename	Filename
	# stream follows containing attributes


DeleteFile	33	Command(Success)
	int64		InDirectory
	Filename	Filename
	# will return 0 if the object couldn't be found in the specified directory


GetBlockIndexByID	34	Command(Success)
	int64		ObjectID

	# stream of the block index follows the reply
	# returns an error if the object didn't exist


GetBlockIndexByName	35	Command(Success)
	int64		InDirectory
	Filename	Filename

	# Success object contains the found ID -- or 0 if the entry wasn't found in the directory
	# stream of the block index follows the reply if found ID != 0


UndeleteFile	36	Command(Success)
	int64		InDirectory
	int64		ObjectID
	# will return 0 if the object couldn't be found in the specified directory


# -------------------------------------------------------------------------------------
#  Information commands
# -------------------------------------------------------------------------------------

GetAccountUsage	40	Command(AccountUsage)
	# no data members

AccountUsage	41	Reply
	int64	BlocksUsed
	int64	BlocksInOldFiles
	int64	BlocksInDeletedFiles
	int64	BlocksInDirectories
	int64	BlocksSoftLimit
	int64	BlocksHardLimit
	int32	BlockSize

GetIsAlive	42	Command(IsAlive)
	# no data members

IsAlive	43	Reply
	# no data members

GetAccountUsage2	44	Command(AccountUsage2)
	# no data members

AccountUsage2	45	Reply
	String	AccountName
	bool	AccountEnabled
	int64	ClientStoreMarker
	int32	BlockSize
	int64	LastObjectIDUsed
	int64	BlocksUsed
	int64	BlocksInCurrentFiles
	int64	BlocksInOldFiles
	int64	BlocksInDeletedFiles
	int64	BlocksInDirectories
	int64	BlocksSoftLimit
	int64	BlocksHardLimit
	int64	NumCurrentFiles
	int64	NumOldFiles
	int64	NumDeletedFiles
	int64	NumDirectories

# 46 is CreateDirectory2
