Unix

pidgin-nateon 에 커스텀 이모티콘 기능 넣기 - 2

ForceCore 2011. 2. 20. 19:52
http://blog.kaisyu.com/2011/02/pidgin-2710_19.html : 윈도우용 다운로드 받을 수 있는 곳

https://github.com/forcecore/pidgin-nateon   <- 내꺼... 이모티콘 패치가 된 버전의 소스코드는 여기에.

다른 분들의 github

저 리퀘에는 이렇게 답하면 된다.
WHSP 4 ssss@nate.com EMOTICON ACK2%091%09ec785ae80a50a5e2d5aa7164043e0c17d2a96785.png%093815%09헣%09
그래서 이렇게 ACK을 보냈더니... (dpkey가 붙으면 안 되더군)

WHSP 0 ssss@nate.com|dpc_03805:12876|X0HA EMOTICON REQDATA%091%09헣%09

WHSP 0 ssss@nate.com|dpc_06904:1016|X0HA EMOTICON REQDATA%092%09헣%09킄%09
이런 답이 돌아온다. REQDATA가 한방에 여러개 들어올 수 있다. -_-... 으음... 그럼 피진도 ACK2가 오면 저렇게 REQDATA를 요구할 수 있도록 해야겠군. REQDATA이후는 아마 대화창 면상(?)과 비슷한 과정을 밟을 듯 하다. (DPIMG REQUEST문을 처리하는 부분이 whsp_cmd에 있으니 그걸 컨닝하면 될듯...)

< (20:24:30) nateon: C: SB 002: WHSP 2 ssss@nate.com EMOTICON REQUEST2%091%09:_%092

> (20:24:30) nateon: S: SB 002: WHSP 0 ssss@nate.com|dpc_06805:5041|X0HA EMOTICON ACK2%091%09NCE20110218225301.bmp%091498%09:_%09

< (20:24:30) nateon: C: SB 002: WHSP 3 ssss@nate.com EMOTICON REQDATA%091%09:_%09

> (20:24:30) nateon: S: SB 002: CTOC 0 ssss@nate.com U 1533
(20:24:30) nateon: Unhandled command 'CTOC'

흐음. CTOC 명령이 날아오네? 그것도 WHSP에 충첩되어서 날아오는듯... 이 아니고, 그냥 날아온다. Switchboard용 CTOC command를 넣어주니 일단 그 뒤에 붙어오는 명령어를 받아올 수 있어서 일단 한시름 놓게 되었다. 그러나 CTOC에 얹혀오는 내용이 문제.

EMFL NCE20110221112917.bmp 1498 :_ BM?
이런게 온다. %09자리에 실제 아스키값9번 기호인 탭이 들어가있다. (공백으로 보이는 저것)
EMFL\tfilename\tsize\tshortcut\t이미지2진수그자체??

CTOC 0 ssss@nate.com dpc_04503:8411|jnVm 61
다른 CTOC 명령은 이런 식인데
CTOC 0 ssss@nate.com U 1533
이렇게, dpkey가 아니라 U가 들어간게 뭔가 수상하다. 아마도 이건 인코딩 하지 않은 바이너리를 받으라 그말 같음. 이 예감이 적중했다. 저기 BM?에서 출력이 끊긴 이유는

1. strdup으로 메모리 복제를 시도해서 \0에서 멈췄음.
2. printf %s로 출력해서 \0에서 멈췄음

이 두가지 이유 때문이다. shortcut 다음에 오는 tab까지 끊고, 나머지는 파일의 실제 내용이 통째로 CTOC로 온 것이다! fopen w+b 로 파일에다 출력 시켜봐서 알아낸 사항임. 그 말은...

1. 파일전송 프로토콜을 안 쓰고 무식하게 이모티콘이 넘어왔다는 점 ㅋㅋ
2. 이제 더 이상의 주고받는 메시지는 없다!!! 프로토콜에 대해 알아내는건 이제 끝났다는 것이다. 오오...

이젠 프로토콜보단 어떻게 피진이 이 이모티콘에 대해 반응하게 하느냐가 문제이다. 즉, 이제 피진의 프로그래밍 문제란 것이다... 다시 M$N 메신저를 컨닝해야 할 시점이 된 것임. 오는 이모티콘을 받았으면... 에...
got_emoticon
이것을 컨닝.

purple_conv_custom_smiley_write
purple_conv_custom_smiley_close
이 두 함수가 맞는 것 같구만... 인데 이건 있는 smiley를 업데이트 하는 것이다.
purple_conv_custom_smiley_add 이것도 써야함...

API 문서를 읽어보면 purple_conv_custom_smiley_add 에는 체크섬 기능이 있어서 새 이모티콘인데 같은 shortcut인지 아닌지 체크해주는 양 적혀있지만 그렇지 않다 -_-;; 내가 알아서 관리해야 한다 OTL 체크썸따위 없다. 대화별로 같은 shortcut은 한번만 전송되게 하는 것이다?

프로토콜에 버그가 있는거 같은데, 이모티콘을 한번에 두 개 보내려고 시도하는 경우, 한 개만 간다

WHSP 0 ssss@nate.com|dpc_06904:1016|X0HA EMOTICON REQDATA%092%09헣%09킄%09

즉 이런 리퀘스트라면, 이모티콘은 헣 에 대한 것만 답변으로 오더라. 네이트온 4,x의 버그인듯. 진짜다... 네이트온끼리, 처음 보는 생소한 이모티콘을 동시에 두개 이상 보내려고 하면 첫번째 것만 간다 -_-;;

어쨌든 이제 좀 이해가 되었는데... 상대방한테 이모티콘 데이터를 받은 것과는 별개로,
purple_conv_custom_smiley_add 를 콜해봐서, TRUE가 나오면, GUI에 이모티콘을 그려야 하는 상태이다. 그래서...
purple_conv_custom_smiley_write
purple_conv_custom_smiley_close
이 두 함수를 써서 그려줘야 한다... 알아서 되는게 아니었군 ㅎㄷㄷ.

또 문제가 있는데. 전혀 처음보는 이모티콘을 상대방이 쓰는 경우, 메시지가 뜨긴 떠야겠는데 이모티콘 파일 전송이 다 되지 않은 상태라 문제가 생긴단 것이다. 이렇듯 상대방의 반응이 있어야 다음 단계로 넘어갈 수 있는 명령이 synchronous command인듯. 여태껏 피진네이트온 코딩을 하면서 sync command는 건든적도 없으니 좀 낯설다.

EMOTICON OBJECT 명령어 자체를 synchronous 명령어로 만들어야 할듯. (이모티콘 사용한단 메시지 그 자체).

nateon_switchboard_request_add_user
이게 synchronouse command인듯...!! 이걸 잘 컨닝하면 할 수 있을 듯...
안된다 -_-;; 싱크로너스가 아니었다. 
    /* this doesn't do anything, but users seem to think that
     * 'Unhandled command' is some kind of error, so we don't report it */
이런 코멘트가 있음 -_-;;

Queue라는게 곳곳에 있던데, 이게 어쩌면 -_-???? 도움이 될지도 모르겠다. 이모티콘이 다 올때까지 MSG 명령은 실행 안 하게 고쳐버리는 것이다??... 보내는 메시지큐라 그닥 도움 안 되는듯...

아마도 내 생각엔, queue를 직접 하나 만들어야할 듯 하다. 이모티콘이 전송중인 때에는 queue에 넣고, 전송이 끝나면 dequeue시켜버려서 메시지가 뜨게 하는 것이다. 디큐도 처리했는데 문제는 -_-;; 그리는 부분 코드가 또 뻑나서 (실행구조가 바뀌었기 때문) 다시 넣어주었다.

마지막 문제는 상대방이 대화를 먼저 걸어왔을 때 이모티콘을 넣었으면 그 이모티콘이 안 보인다는 것이다. M$N메신저에서도 같은 문제가 있었고... 그걸 해결한 코드도 있어서 그걸 컨닝해서 해결했다
msn.c 1000번째 줄
        /* If the conversation doesn't exist then this is a custom smiley
         * used in the first message in a MSN conversation: we need to create
         * the conversation now, otherwise the custom smiley won't be shown.
         * This happens because every GtkIMHtml has its own smiley tree: if
         * the conversation doesn't exist then we cannot associate the new
         * smiley with its GtkIMHtml widget. */
        if (!conv) {
            conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, session->account, who);
        }
저렇게 conversation을 생성해주면 디엔드.

완성 했는데... 릴리즈는 지금 시간이 늦은 관계로, 내일.