/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _MTP_PACKET_H
#define _MTP_PACKET_H

#include <android-base/macros.h>

#include "MtpDebug.h"
#include "MtpTypes.h"

struct usb_device;
struct usb_request;

class MtpPacket {

protected:
	uint8_t*			mBuffer;
	// current size of the buffer
	size_t				mBufferSize;
	// number of bytes to add when resizing the buffer
	size_t				mAllocationIncrement;
	// size of the data in the packet
	size_t				mPacketSize;

public:
	explicit			MtpPacket(int bufferSize);
	virtual				~MtpPacket();

	// sets packet size to the default container size and sets buffer to zero
	virtual void		reset();

	void				allocate(size_t length);
	void				dump();
	void				copyFrom(const MtpPacket& src);

	uint16_t			getContainerCode() const;
	void				setContainerCode(uint16_t code);

	uint16_t			getContainerType() const;

	MtpTransactionID	getTransactionID() const;
	void				setTransactionID(MtpTransactionID id);

	uint32_t			getParameter(int index) const;
	void				setParameter(int index, uint32_t value);

#ifdef MTP_HOST
	int					transfer(struct usb_request* request);
#endif

protected:
	uint16_t			getUInt16(int offset) const;
	uint32_t			getUInt32(int offset) const;
	void				putUInt16(int offset, uint16_t value);
	void				putUInt32(int offset, uint32_t value);

	DISALLOW_COPY_AND_ASSIGN(MtpPacket);
};

#endif // _MTP_PACKET_H
