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 |
