Unix/Ubuntu

pidgin 쪽지에 답장기능을 달자? 패치 제작기 -_-

ForceCore 2010. 6. 11. 11:33

이랬던 쪽지가



이렇게 변함. 인증샷!



pidgin에 답장 기능이 생기기를 기다리고 있는데 (더불어, 메일주소 말고, 어떤 놈이 보냈는지 보는 기능도), 도저히 안 생긴다. 내가 건드려 보고, 패치를 보내보기로 했다. 핧핧핧 리눅스 유저인지 이제 2년쯤 되어가는데 한번 해볼만도 하지 (?).

행복 전도사 버전:
리눅서면 패치도 한번 만들어 봐야 하잖아요! 코딩을 모르면 리눅서가 아니잖아요? 그냥 컴맹이지 ㅋㅋ. 다들 표정들이 왜 그래요? hello world 한번도 컴파일 안해본 사람들처럼!!

일단 소스코드를 받고...
pidgin-2.7.1.tar.bz2 였음.

./configure 통과하기

./configure 를 하는데 통과가 안된다.

intltools를 패키지로 설치하고 (없다고 그래서)

XScreenSaver extension development headers not found.
이것도 언급되는데 까짓거 설치해주지.
libxss-dev 패키지임 (헑 이름이 연관성이... xss가 약어긴 하구나)

Startup notification development headers not found.

일일히 찾아선 끝도 없겠군!

XScreenSaver extension development headers not found.: libxss-dev
Startup notification development headers not found.: libstartup-notification0-dev
GStreamer development headers not found.: libgstreamer0.10-dev
Meanwhile development headers not found.: libmeanwhile-dev
D-Bus development headers not found.: libdbus-1-dev libdbus-glib-1-dev
NetworkManager development headers not found.: network-manager-dev
Perl development headers not found.: libperl-dev
Tcl development headers not found.: tcl8.4-dev
Tk development headers not found.: tk8.4.dev
GtkSpell development headers not found.?libgtkspell-dev
avahi development headers not found.:libavahi-client-dev libavahi-glib-dev

이렇다고 하네. 굿. 길고 아름다운 명령어. 위에 적은 패키지는 좀 버전이 안 맞을 수 있음을 주의하라. 아래 명령어도 마찬가지다. 버전이 달라서 맞지 않게 된 패키지 이름은 각자 정정하기로 하고:... 아래쪽에 더 완성된 명령어가 있으니 이거는 스킵해도 됨.
sudo apt-get install libxss-dev libstartup-notification0-dev libgstreamer0.10-dev libmeanwhile-dev libdbus-1-dev libdbus-glib-1-dev network-manager-dev libperl-dev tcl-dev tk-dev libgtkspell-dev libavahi-client-dev libavahi-glib-dev
이렇게 명령을 내려주고 다시 configure를 시도하면...

Dependencies for voice/video were not met.
ㅋㅋㅋ 피진이 발전해서 나오는 에러군. 위 링크에 제시된 패키지로도 부족한건가!
libgstfarsight0.10-dev
로 해결이 안 되다니. 이건 내가 할려는 일과 관계 없는거 같고. 그냥 쿨하게 넘어가지 뭐. 패키지로 제공되는 버전이 너무 낮아서 컴파일 안 되는 것임 -_-;; 필자는 패키지주의자니깐... 직접 컴파일은 되도록 피한다. 다른 패키지를 찾던가 하면 되긴 하는데... 딱히 필요한 부분은 아니니 넘어간다.

./configure --disable-vv 로 진행.

GNU Libidn development headers not found.
libidn11-dev

Neither GnuTLS or NSS SSL development headers found.
libgnutls-dev
이건 좀 중요한 library인듯.

이제쯤 될 때가 되었는데... 라고 느끼니 드디어 configure가 성공했다. 샒

sudo apt-get install libxss-dev libstartup-notification0-dev libgstreamer0.10-dev libmeanwhile-dev libdbus-1-dev libdbus-glib-1-dev network-manager-dev libperl-dev tcl-dev tk-dev libgtkspell-dev libavahi-client-dev libavahi-glib-dev libidn11-dev libgnutls-dev
./configure --disable-vv 로 함.
결국 설치해야 하는 패키지는 위와 같다.

make 단계

잘 된다. 오래 걸려서 그렇지;; ㅋㅋㅋ;; 에러 없음. Ubuntu 10.04에서 테스트.

어? 쪽지 기능은 어디 들어있나?

ㅋㅋㅋ;;; pidgin기능이 아니라 pidgin-nateon에 들어있는거였네? 헛수고했다? 아닌가? 컼 ㅋㅋ 으음... 아닌가. 이쪽은 프로토콜을 담당하는거고... 조금 소스코드를 파헤치면서 감을 잡아보는데 뭐... 일단은 po디렉토리의 메시지부터 디벼본다. 쪽지 보내기... 이런게 매뉴에 있으니 그 string을 등장시키게 하는 소스코드를 검색하면 되는거지.

Send Memo가 쪽지 보내기니깐 소스코드 중 memo.c를 보면 되는거군.
그리고 계속 이거저거 보다가 nateon.c 인가에 메모를 보내는 과정을 담은 함수가 있는 것도 보게 되었음.

static void
send_memo(PurpleConnection *gc, const char *who, const char *entry);

그 함수 안에는
nateon_memo_set_body(memo, entry);
이런 코드도 있음.

entry가 함수의 parameter로 들어온 거니까 아무래도 이미 쪽지 창은 pidgin에서 알아서 처리한 다음에, send_memo함수를 콜 해서 메모가 보내진다는 그런 느낌으로 보면 될 듯. 그럼 send_memo는 누가 콜하냐;; 콜하는 놈 없음. 그러므로 범인은 다시 pidgin일 것으로 생각됨.

pidgin에서 cscope -R 로 한번 째려봤는데 또 아무것도 없다 ㅡ,.ㅡ...;;...

어떻게 되는거냐면 nateon_buddy_menu 함수에서 callback 함수로 show_send_memo_cb 이런게 등록되는 것임. 이건 "보내는쪽" 다이얼로그가 뜨는건데 흠... 일단 뜯어보지 뭐. purple_request_input 이런 함수도 있군.

memo.c에서 feel이 가는 함수 발견.

static void
imsg_cmd(NateonCmdProc *cmdproc, NateonCommand *cmd)
pidgin 창의 디버거를 켜서 쪽지가 오면 무슨 일이 벌어지나 알아내어서, 프로토콜 중 IMSG 명령이 동작한다는 것을 알아냈고, 위 함수가 쪽지 수신때 작동한단 것을 알았다. notification.c 에 들어있군. 그리고 "쪽지"라고 하드코딩 되어 들어간 string 발견. _("Incoming Memo")로 변경. po파일 생성할 때 인식되라고.

음...  ko.po를 어떻게 수정하냐;; 매뉴얼 없음.
 Makefile을 뜯어본 결과
make update-po
를 하면 po파일을 소스코드 스캔을 해서 다시 생성함.3개 번역 안 되었다고 하는 string이 있군.  2개 번역 안 된 string은 디버그 메시지에서 온건가? 하여튼 신경 끄고 필자가 새로 추가한 것은 Incoming Memo를 수정. 스트링은 이렇게 하는거구나 ㅋ0ㅋ 이왕 패치 보내는거 제대로 해야지.

쪽지 기능 수정

이제 문제점을 생각해보자. 뭘 하고싶은건지.
1. 쪽지창에 답장 버튼도 달고 싶다. 버튼 이름이 "답장"은 아니라도 말이지.
2. 누가 보냈는지 메일주소 뿐 아니라 현재 대화명(friendly name)도 알아내고 싶다. 2번은 어떻게든 될 것 같음. 1번부터 해보지 뭐... 가장 하고 싶은거니까.

이제 문제는 뭐냐면 쪽지 창을 어떻게 바꾸느냐인데...
purple_notify_formatted
분명 이 함수가 창을 띄우는 함수이긴 한데, 뭔가 구린데가 있는 것 ㅋㅋ. 닫기버튼밖에 없는 미친 창. 이제쯤 Pidgin 매뉴얼을 뒤져서 yes/no, 확인/취소 그런 거 + notification이 동시에 들어있는 창을 알아내야 함.

메시지 창이 뜨는 건 좋은데, 메시지를 긁어붙일 수 있냐 없냐가 큰 문제. 어떡하냐 ㅋㅋㅋㅋ;;; 상대방이 보낸 메시지를 긁어서 다른데 붙이고 싶을 수도 있으니까.

음... 우선은, 버튼 달린 창을 알아내는게 1순위. "동기화 오류" 어쩌구저쩌구 하면서 서버상에는 친구목록 어쩌구 하는 창이 yes/no버튼이 있었지. 그놈 이름을 알아냈다. (po파일부터 추적해서).

purple_request_action
이놈이다.

라이브러리를 뜯어보니 처음보는 함수들이 많았다. GTK라이브러리 함수도 있었고 purple의 함수도 있었는데... string 관련 함수들은 편한게 많아 보였다. 매뉴얼 뒤져가면서 해석하면서 코드를 읽었음. 언뜻 보니 쪽지 기능 쪽에 memory leak이 있는거 같던데;; 그래서 그것도 이왕 패치 만드는 김에 해결해 주었다 (-_-). (??애초에 문제가 없었는지도 모르겠다만)

근데 버그 잡는게 힘들었음. 왜냐면. 자꾸 튕겨서, 자꾸 로그인을 반복해서 -_-... 그러면 다른 사람들한테는 "들락날락"하는 것으로 보인다. 1분에 10번넘게 그러면 다른 사람들이 짜증날듯. 결국 네이트온을 한번 더 가입해서 해결 -_-;;( 같은 민번으로 네이트온은 두번 가입 가능하다. 세컨id허용임. -0-;;). 이로서 혼자서도 쪽지를 테스트 해볼 수 있게 되었다.

여러가지 삽질 흫 ;;
account/session 이 서로 포인팅 하는 이상한 자료구조도 있고 여러모로 헷갈리게 되어 있었다. 무슨함수가 무슨 함수와 관련되어 있는지 좀 퍼즐을 맞춰야 함...

자꾸 segmentation fault 가 떠서 뭔가 했더니 내가 free 시점을 엉터리로 하고 있던 것: local에서 alloc한 것을 local에서 free하면 안 되는 것이었다: pidgin은 thread로 되어 있어서 callback함수에 포인터로 된 parameter를 줄 때에는 절대로 local variable에 대한 포인터를 주면 안 되는 것이었다. string같은 경우는 malloc이 새로 잡히는 버전으로 스트링을 복사할 것. free는 callback함수의 몫이고, caller의 역할은 아니다. 이걸 깨닫고 나니 금방 성공함. (pidgin 홈페이지에, 개발자 매뉴얼 중, 가장 명심해야 할 사항만 적어놓은 페이지가 있음. 거기에 thread 어쩌구라고 적혀있다.)

패치는 svn 147버전 기준이다.


새로 내가 짜넣은 코드는위치가 애매하다.
1. 온 쪽지가 팝업으로 뜨는건 notification.c에서 함.
2. 쪽지를 새로 보내는 것은 memo.c에서 함.

notification.c에서 답장 보내기 버튼을 넣어야 하고 보내는 것은 memo.c의 함수를 써먹어야 하는데 난감한 것임 ㅋㅋ;; 일단 작동은 한다. 네톤 vs 네톤 쪽지는 잘 소화하는데 웹에서 보내는 네이트온 쪽지는 튕김. -_-;; 이거는 그냥 pidgin-nateon 자체의 버그인듯. 이것도 어쩌면 손을 대볼지도 모르겠다.