Unix

Pidgin-nateon 파일 전송기능 수정 - 1

ForceCore 2011. 2. 14. 01:30
저번에는 쪽지 기능을 조금 손봐서 답장 버튼을 달았다. (http://forcecore.tistory.com/1129)
이번에는, 네이트온이 버전업을 하면서 윈도우 버전의 nateon과 호화성이 깨진 파일 전송 기능을 되살리려고 한다.
Pidgin-Nateon이 왜 가능했는지 이제 알게 되었는데, 다행히 리눅스 버전의 네이트온의 소스코드가 GPL이긴 했기 때문이다. 프로토콜은 비공개라지만... 소스코드는 가져다 쓸 근거는 된다. (컴퓨터가 아닌 곳에서, 리눅스가 아닌 곳에서 접속하면 접속을 서버와의 끊을 근거가 된다지만 다행히 리눅스 데탑에서 쓰면 끊을 조건엔 안 들어간다.)

그러므로 용기 내어서 파일 전송기능 코드를 가져오면 된다(?) 라고는 하지만 아마 코드를 많이 고쳐야 할 것이다.

그래도 아직 어디서 코드를 컨닝해야 하는지조차 모르므로 코드를 디벼봐야 한다.
파일 이름부터 살펴보면

./dialog/filetransfer.cpp
./dialog/filetransferinterface.h
./dialog/filetransferinterface.cpp
./dialog/filetransfer.h
./dialog/filetransferinterface.ui
./network/sendfileinfo.h
./network/sendfileinfo.cpp

이런 것들이 수상하군...

동작 -> 파일 보내기 (메뉴) -> 파일 선택 표준 창 -> 파일 전송 다이얼로그 창, 열심히 전송됨.

파일 보내기 메뉴를 찾아내야 헌다!!
knateonmainview.cpp
이게 메인창일라나? 흐음;;
친구한테 우클릭해서 파일 보내기 기능을 하는 컨텍스트 메뉴(우클릭 메뉴)를 찾거나...
이게 안 되면 친구 대화창의 메뉴를 어떻게든 찾아내야 하는데 ㅋㅋ

"파일 보내기" 로 string search를 하는게 빠를듯. cscope에 한글 입력이 안 되네?! grep을 쓰자.
$ grep -ir "파일 보내기" *
chat/chatviewinterface.cpp:    m_nSendFile = action->insertItem( /*p1,*/ UTF8("파일 보내기(&F)"),  this, SLOT( slotSendFile() ), CTRL+Key_F);
chat/chatview.cpp:                                 UTF8("파일 보내기")
knateon.cpp:        /*! 오른쪽 마우스 메뉴에서 파일 보내기 */
knateon.cpp: * 파일 보내기.
knateon.cpp:  파일 보내기.
knateon.h:    /*! 마우스오른쪽/메뉴에서 파일 보내기 */
knateonmainview.cpp:    pSendfileAction         = new KAction(UTF8("파일 보내기"), 0, 0, this, "sendFile");
knateonmainview.h:    KAction*        pSendfileAction;        // 파일 보내기
knateonview.cpp:    pSendfileAction         = new KAction(UTF8("파일 보내기(&F)"), 0, KShortcut( Qt::CTRL+Qt::Key_T), this, "SendFile");
network/nomp2pbase.cpp:  파일 보내기
network/nomp2pbase.cpp:    /*! 파일 보내기 */
헴. chatviewinterface.cpp나, chatview.cpp 여기서 시작하는 게 좋겠군. knateon.cpp 에도 오른쪽 마우스 메뉴에서 파일 보내기... 이런게 있군. 설명이 아주 직설적이므로 knateon.cpp 에서 추적해보겠다.

/*! 오른쪽 마우스 메뉴에서 파일 보내기 */
        connect(m_pMainView->pSendfileAction, SIGNAL( activated() ), SLOT( slotMenuSendFile() ) );

qt 라이브러리에 대해선 거의 까막눈이지만 (pyGTK는 조금 써봤는데) 아마 이건, 액션과, 기능을 연결시켜주는 것 같은데 에... 컨닝을 해보자.


두 개의 qt 객체를 단방향으로 연결한다니 흠. pSendfileAction이 "activate()"되면 slotMenuSendFile()이 작동한다고 받아들여도 될 것 같은데.
knateon.h
   /*! 마우스오른쪽/메뉴에서 파일 보내기 */
    void slotMenuSendFile();
요렇다는군. 구현은 knateon.cpp의 4704행에 있다. 친구가 접속해 있으면 채팅창을 띄우고 채팅창의 파일 전송 기능을 실행하란 말 처럼 보이는데.

slotSendFile() 함수는 여러군데 동명이인으로 등장한다.
0 chatview.cpp          1368 void ChatView::slotSendFile() {
1 chatviewinterface.cpp  482 void ChatQW::slotSendFile() {
2 knateon.cpp           2901 void KNateon::slotSendFile(SendFileInfo
                             *pSendFileInfo) {
3 p2pconnection.cpp      219 void P2PConnection::slotSendFile(int nSocket) {
어느게 내가 보고 싶은거지? 다 볼 수 밖에.
(파일을 "보내는" 부분의 구현이 보고싶음. 파일을 "받는" 구현도 나중에 봐야겠지만 일단 pidgin -> nateon 부터 성공시킬 생각이다.)

void ChatQW::slotSendFile()
이건 아무것도 안 하므로 패스.

void KNateon::slotSendFile(SendFileInfo *pSendFileInfo)
여기엔 뭔가 그럴듯 한 구현이 되어 있다. 아마, 사실 인터페이스와는 무관한게 파일전송이므로 이게 진짜일 듯 하다.

void P2PConnection::slotSendFile(int nSocket)
여기도 뭔가 그럴 듯 함. 이쪽은 좀 더 프로토콜적인 부분으로 보이는데...

void ChatView::slotSendFile()
여긴 뭐지?
파일 열기 박스를 보이고... 일단은 인터페이스적인 부분이지만 여기서부터 시작하면 될 듯 함. 보낼 파일 목록을 사용자한테 입력 받는 것이군. 파일을 다수 선택할 수 있다. 채팅창의 친구가 모두 join했는지 체크하고 (메인 메뉴에서 파일보내기를 했으면 조인 안 됐을 수도 있지), slotSendFileList( slFileList ); 를 콜한다.

void ChatView::slotSendFileList(const QStringList & slFiles)
바로 이 함수. 으음... 여기도 뭔가 프로토콜적인 구현이 잔뜩 있는 것 같은데. 여기 있는 구현이 "나 파일 보낼거니까 받아라~" 라는 부분일 것이다. 일단 이 코드를 피진에 심어봐야겠다.

피진에서 파일 보내는 쪽을 또 찾아봐야 하네 -_-;;;
아마 xfer.c 여기 있을 듯... 적중.