본문 바로가기

프로그래밍/API

패킷과 함수의 1:1 맵핑~

EncoreNet의 RMI가 IDL을 사용해 코드를 만들어 준다는 jacking님 말씀에.. IDL을 찾아 보았습니다.

윈도우에서 COM을 사용해 보지 않은 저로서는 상당히 어려워 보이더군요..
초보자도 바로 사용하기에는 어려워 보였습니다^^;

그래서 제 나름대로 맵핑시키는 구조를 만들어 보기 위해, CoSingleInvoke() 라는 놈을 만들어 나름대로
최적화를 (어제 올린 부분의 오버헤드가 많아 asm으로 새로 만들었죠~) 해서 구조를 만들어 보려 하고
있습니다.

제가 원하는 스타일은

class Player: public wsaio::handler,
              public relevant::actor
{
public:
    // 자동 생성 필요
    // INTERFACE {
    //     BOOL PACKET_MOVE( Player *self, DWORD obj_id, VECTOR3D v) {
    //       // 개발자 구현 부분
    //     }
    // }
    static BOOL PACKET_MOVE( Player *self, DWORD obj_id, VECTOR3D v) {
        char pack_buffer[1024], *pack_offset = pack_buffer;

        COARGS_PTR( pack_offset, DWORD) = PACKETID_PACKET_MOVE;
        COARGS_PTR( pack_offset, DWORD) = obj_id;
        COARGS_PTR( pack_offset, VECTOR3D) = v;
        return (self->send( pack_buffer, pack_offset - pack_buffer) > 0);
    }

    ....
    // 함수 원형 자동 생성 필요
    static BOOL REMOTE_PACKET_MOVE( Player *self, DWORD obj_id, VECTOR3D v) {
         // 개발자 구현 부분 ....
    }

    static ULONG_PTR getMethod( DWORD methodId) {
         // 자동 생성 필요
         switch (methodId) {
            case PACKETID_MOVE: return (ULONG_PTR)&REMOTE_PACKET_MOVE;
         } return 0;
    }

    // 자동 생성
    BOOL handler_input( LPWSASOCKET fd, LPWSABUF buf) {
        DWORD *m = *((DWORD *)buf->buf);
        ULONG_PTR method = getMethod( *m);
        if (method != 0)
        {
             BOOL ret;
            *m = (DWORD)this;
            CoSingleInvoke( NULL, method, (ULONG_PTR)&ret, buf->buf, buf->len);
            if (ret == FALSE)
               ...
        }
    }
};


와 같은 player class와 직접 연결하여 사용 하고자 한 것입니다.
지금 고민하고 있습니다..  과연 만든후에 효율성이 어떨지에 대해서... ㅠ.ㅠ

제가 IDL을 사용해 보지 않아서, 어떨지는 모르겠지만.. IDL도 위와같은 코드가 자동생성 될까요?