저번에는 쪽지 기능을 조금 손봐서 답장 버튼을 달았다. (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 여기 있을 듯... 적중.