티스토리 툴바


포트폴리오/libSOPT2010/03/24 16:04
1. 개요
Request_Handler 인터페이스 클래스.
클라이언트의 Request를 추상화하는 인터페이스입니다. 모든 Request는 Header, Payload 구조를 지니게 됩니다.

Header: urgent_request, header_length, payload_length를 반드시 포함해야합니다.

urgent_request: 해당 Request가 Executor로 전달되어 처리되어야 하는지, Executor에 전달되지 않고 바로 처리되어야 하는지를 나타냅니다. Request_Handler를 상속하는 구현체는 urgent_request 메소드를 반드시 구현해야하며, 메소드가 0이 아닌값을 반환한다면, 해당 Request는 Executor에 전달되지 않고 바로 처리됩니다.
header_length: Header의 길이를 나타냅니다. Request_Handler를 상속하는 구현체는header_length 메소드를 반드시 구현해야 합니다.
payload_length: Header뒤에 따라오는 payload의 데이터 길이를 나타냅니다. Request_Handler를 상속하는 구현체는payload_length 메소드를 반드시 구현해야 합니다.
Payload: Header의 뒤에 따라오는 application-specific한 데이터 입니다. Header의 payload_length를 이용해 payload의 크기를 알수 있습니다.

또한, equest_Handler를 상속하는 구현체 call 메소드를 반드시 구현해야 합니다. call 메소드는 application-specific한 서비스 로직을 표현합니다. Executor에 의해 실행되거나, urgent_request가 0이 아닌값을 반환한다면 Executor에 전달되지 않으며, 즉시, call 메소드를 호출하게 됩니다.

Request_Handler는 RefCount기법을 이용해 생명주기를 관리합니다. 모든 Request_Handler 객체는 반드시 사용이 끝난 후 clear 메소드를 올바르게 호출해야 합니다. Executor에 의해 Request_Handler가 실행되었다면, Executor의 execute_done 메소드에서 clear 메소드의 호출을 보장합니다.


2. Request_Handler의 선언은 다음과 같습니다.
// -*- C++ -*-

//=============================================================================
/**
 *  @file    request_handler.h
 *
 *  $Id: request_handler.h Fri Mon 16 17:23:23 GMT+09:00 2009
 *
 *  @author Copyright 2008-2009 SOPT(Shout Our Passion Together)
 */
//=============================================================================

#ifndef _REQUEST_HANDLER_DEFINE
#define _REQUEST_HANDLER_DEFINE

#if !defined (ACE_LACKS_PRAGMA_ONCE)
#pragma once
#endif

#include "ace/Method_Request.h"
#include "ace/Message_Block.h"

#if defined(ACE_WIN32)
#include "sopt_export.h"
#elif
typedef SOPT_Export ACE_Export
#endif

namespace libsopt {

	class Server;
	class Stream_Handler;

  /**
	* @class Request_Handler
	* 
	* @brief Request_Handler 인터페이스 클래스
	*
	* 클라이언트의 Request를 추상화하는 인터페이스입니다.
	* 모든 Request는 Header, Payload 구조를 지니게 됩니다.
	*
	* Header: urgent_request, header_length, payload_length를 반드시 포함해야합니다. 
	*	- urgent_request: 해당 Request가 Executor로 전달되어 처리되어야 하는지, 
	*	Executor에 전달되지 않고 바로 처리되어야 하는지를 나타냅니다.
	*	Request_Handler를 상속하는 구현체는 urgent_request 메소드를 반드시 구현해야하며,
	*	메소드가 0이 아닌값을 반환한다면, 해당 Request는 Executor에 전달되지 않고 바로 처리됩니다.
	*	- header_length: Header의 길이를 나타냅니다.
	*	Request_Handler를 상속하는 구현체는header_length 메소드를 반드시 구현해야 합니다.
	*	- payload_length: Header뒤에 따라오는 payload의 데이터 길이를 나타냅니다.
	*	Request_Handler를 상속하는 구현체는payload_length 메소드를 반드시 구현해야 합니다.
	*
	* Payload: Header의 뒤에 따라오는 application-specific한 데이터 입니다.
	* Header의 payload_length를 이용해 payload의 크기를 알수 있습니다.
	* 
	* 또한, equest_Handler를 상속하는 구현체 call 메소드를 반드시 구현해야 합니다.
	* call 메소드는 application-specific한 서비스 로직을 표현합니다.
	* Executor에 의해 실행되거나, urgent_request가 0이 아닌값을 반환한다면 Executor에 전달되지 않으며,
	* 즉시, call 메소드를 호출하게 됩니다.
	*
	* Request_Handler는 RefCount기법을 이용해 생명주기를 관리합니다.
	* 모든 Request_Handler 객체는 반드시 사용이 끝난 후 clear 메소드를 올바르게 호출해야 합니다.
	* Executor에 의해 Request_Handler가 실행되었다면, Executor의 execute_done 메소드에서 clear 메소드의
	* 호출을 보장합니다.
	*/
	class SOPT_Export Request_Handler :
		public ACE_Method_Request, 
		public ACE_Message_Block {
	protected :

		/// Request_Handler를 생성한 Server 객체에 대한 포인터
		Server *serv_;

		/// Request_Handler를 전송한 Stream_Handler 객체에 대한 포인터
		Stream_Handler *stream_handler_;

	public :

		/// 기본생성자
		explicit Request_Handler(Stream_Handler *h = 0)
			: stream_handler_(h)
		{ /* empty */ }

		/// 기본소멸자
		virtual ~Request_Handler()
		{ /* empty */ }

		/// Request_Handler를 초기화 합니다.
		int open();

		/// Request_Handler의 RefCount를 1 감소시킵니다.
		void clear();

		/// Stream_Handler의 RefCount를 1 감소시킵니다.
		void stream_handler_clear(); 

		/// Header의 크기를 반환합니다.
		/// Request_Handler는 상속하는 규현체는 해당 메소드를 반드시 구현해야합니다.
		virtual size_t header_length() = 0;

		/// Payload의 크기를 반환합니다.
		/// Request_Handler는 상속하는 규현체는 해당 메소드를 반드시 구현해야합니다.
		virtual size_t payload_length() = 0;

		/// Urgent Request를 구별합니다.
		/// Request_Handler는 상속하는 규현체는 해당 메소드를 반드시 구현해야합니다.
		virtual int urgent_request() = 0;

		/// application-specific한 서비스 로직 입니다.
		/// Request_Handler는 상속하는 규현체는 해당 메소드를 반드시 구현해야합니다.
		virtual int call() = 0;

	   /**
		* Request_Handler parsing 헬퍼 메소드
		* offset으로부터 length의 길이반큼 바이트를 읽어 T로 변환하여 반환합니다.
		*
		* @param T 변환할 타입
		* @param offset 기준점
		* @param length 바이트길이
		*/
		template<typename T>
		T read_data(int offset, int length = sizeof T)
		{
			T *data = (T*)(this->base() + offset);
			return *data;
		}

		/// stream_handler_ = h;
		void stream_handler(Stream_Handler *h)
		{ stream_handler_ = h; }

		/// return stream_handler_;
		Stream_Handler * stream_handler()
		{ return stream_handler_; }

		/// return serv_;
		Server *server() const
		{ return serv_; }

		/// serv_ = serv;
		void server(Server *serv)
		{ serv_ = serv; }
	};

};

#endif

'포트폴리오 > libSOPT' 카테고리의 다른 글

libSOPT다운로드  (0) 2010/03/24
libSOPT기반 echo server  (0) 2010/03/24
libSOPT::Server  (0) 2010/03/24
libSOPT::Executor  (0) 2010/03/24
libSOPT::Request_Handler  (0) 2010/03/24
libSOPT::Stream_Handler  (0) 2010/03/24
libSOPT::Acceptor  (0) 2010/03/24
libSOPT 소개  (0) 2010/03/24
Posted by BONZOA
TAG , ,