calendarengines/caldav/inc/httpclient.h
author Maximilian Odendahl <maximilian.odendahl@sun.com>
Fri, 05 Feb 2010 10:16:42 +0100
changeset 1 4927282092b4
child 6 5a04f2ceabfe
permissions -rw-r--r--
Bug 208: inital CalDAV support for Symbian

/*
* Copyright (c) 2010 Sun Microsystems, Inc. and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributor:
* Maximilian Odendahl
*
* Contributors:
* 
* Description: 
*
*/

#ifndef HTTPCLIENT_H
#define HTTPCLIENT_H

#include <http\MHTTPAuthenticationCallback.h>
#include <http\mhttptransactioncallback.h>
#include <http\mhttpdatasupplier.h>

#include <es_sock.h>
#include <extendedconnpref.h>

struct TCalDAVOptions;

_LIT8(KHTTP200,"http/1.1 200 ok");
_LIT8(KHTTP201,"http/1.1 201 created");
_LIT8(KHTTP404,"http/1.1 404 not found");

#define ERROR 			0
#define OK				200
#define CREATED 		201
#define NOCONTENT		204
#define MULTISTATUS		207
#define MUTIPLECHOICES	300
#define BADREQUEST		400
#define FORBIDDEN		403
#define NOTFOUND		404
#define NOTALLOWED		405
#define CONFLICT		409
#define PRECONDFAILED 	412

enum THttpAction
	{
	EActionUpload, EActionDelete, EActionOption, EActionNone
	};

class CHttpClient : public CBase,
		public MHTTPDataSupplier,
		public MHTTPAuthenticationCallback,
		public MHTTPTransactionCallback
	{
public:
	virtual ~CHttpClient();
	static CHttpClient* NewLC();
	static CHttpClient* NewL();

	TInt PutL(const TDesC8 &aUrl, const TDesC8 &aICS, CBufFlat *aResponse,
			const TDesC8 &aEtag = KNullDesC8);
	TInt MkCalendarL(const TDesC8 &aUrl, const TDesC8 &aBody,
			CBufFlat *aResponse);
	TInt DeleteL(const TDesC8 &aUrl, const TDesC8 &aETag = KNullDesC8);
	TInt HeadL(const TDesC8 &aUrl);
	TInt GetL(const TDesC8 &aUrl, CBufFlat *aResponse);
	TInt PropfindL(const TDesC8 &aUrl, const TDesC8 &aBodyRequest,
			CBufFlat *aResponse, TBool depth0 = ETrue);
	TInt ReportL(const TDesC8 &aUrl, const TDesC8 &aBodyRequest,
			CBufFlat *aResponse);
	TInt ProppatchL(const TDesC8 &aUrl, const TDesC8 &aBodyRequest,
			CBufFlat *aResponse);

	TInt GetServerOptionsL(const TDesC8 &aUrl, TCalDAVOptions &aOptions);

	// methods inherited from MHTTPDataSupplier
	virtual TBool GetNextDataPart(TPtrC8& aDataPart);
	virtual void ReleaseData();
	virtual TInt OverallDataSize();
	virtual TInt Reset();

	TInt ReturnCode();
	TPtrC8 ETag();

	//
	// methods from MHTTPTransactionCallback
	//
	virtual void MHFRunL(RHTTPTransaction aTransaction,
			const THTTPEvent& aEvent);
	virtual TInt MHFRunError(TInt aError, RHTTPTransaction aTransaction,
			const THTTPEvent& aEvent);
	
	// methods inherited from MHTTPAuthenticationCallback
	virtual TBool GetCredentialsL(const TUriC8& aURI, RString aRealm,
			RStringF aAuthenticationType, RString& aUsername,
			RString& aPassword);

	TPtrC8 User();
	void SetUserL(const TDesC8 &aUser);

	void SetPasswordL(const TDesC8 &aPassword);
	TPtrC8 Password();

protected:
	CHttpClient();
	void ConstructL();
private:

	void InvokeHttpMethodL(const TDesC8& aUri, RStringF aMethod);
	void SetHeaderL(RHTTPHeaders aHeaders, TInt aHdrField,
			const TDesC8& aHdrValue);
	void SetHeaderL(RHTTPHeaders aHeaders, const TDesC8 &aField,
			const TDesC8 &aValue);
	void GetEtagHeaderL(RHTTPTransaction& aTransaction);

	void GetPostBodyManuallyL();

	void OpenSessionL();

private:
	RHTTPSession iSess;
	RHTTPTransaction iTrans;
	TParse iParsedFileName;
	CBufFlat* iBodyResponse;
	HBufC8* iBodyRequest;

	RSocketServ iSocketServ;
	RConnection iRConnection;
	TConnPrefList iPrefList;
	TExtendedConnPref iExtPrefs;

	HBufC8 *iUser;
	HBufC8 *iPassword;

	TCalDAVOptions *iOptions;
	THttpAction iAction;

	TInt iReturnCode;
	HBufC8* iEtag;
	TInt iCredentialCount;

	};

#endif