1. 시작하며
| ||||||||||
지난 네 번째의 강좌를 올리고 나서 필자는 많은 생각을 하게 되었다. 짤막한 내용으로 계속해서 강의를 올렸었는데, 얼마나 도움이 되었는지는 알 수 없지만, Q & A 게시판 등에서 필자의 글을 읽어주시는 분들이 많은 것 같아서 한 편으로는 뿌듯하기도 하고, 다른 한편으로는 밀려오는 막중한 부담감이 생기기도 한다. 이번 장에서는 기존에 예고했던 것과 약간 순서를 달리하여 brew에서 파일을 관리하는 방법을 예제를 통해서 공부해볼 것이다. 이미 지난 4번의 강좌를 통해서 어느 정도 기본적인 사항들을 이해하고 있다고 가정하고, 프로젝트 생성이나 컴파일 방법에 대한 내용은 생략하고 바로 소스 분석으로 들어가도록 하겠다. 만약 내용이 어려우신 분들은 앞의 강좌를 충분히 읽어보시고 따라오시기 바라며, 행여 어려움이 계신 분들은 Q & A 게시판이나 메일로 질문을 보내주시기 바란다. | ||||||||||
2. 프로그램 계획
| ||||||||||
파일 애플릿에서는 크게 두 가지의 작업이 있다. 첫번째는 기존에 존재하는 파일에서 데이터를 읽어들여 화면에 출력하는 작업이고, 두번째는 메모리에 있는 내용을 파일에 쓰는 작업이다. 이 중에서 파일에 쓰기 작업을 할 때에는 기존에 파일이 존재하는지 검사하고 파일이 존재하면 파일 끝에 붙이기(APPEND)를 수행하고, 없다면 새로운 파일을 생성하는 작업을 할 것이다.
| ||||||||||
3. 미리 알아두면 좋은 내용들
| ||||||||||
이전 장까지는 각 소스의 입력과 컴파일, 실행에 촛점을 맞추었지만 이번 장부터는 간단한 설명을 덧붙일 생각이다. 하나의 프로그램마다 몇가지씩을 이해하고 나간다면 더욱더 깊은 공부를 할 수 있지 않을까 하는 생각 때문이다. 1. 애플릿 자체를 가리키는 AEEApplet 구조체 //Structure to hold Applet infprmation typedef struct _AEEApplet AEEApplet; struct _AEEApplet { DECLARE_VTBL(IApplet) AEEModObj * pNext; AEECLSID clsID; uint32 m_nRefs; // Applet reference counter IShell * m_pIShell; // pointer to IShell IModule * m_pIModule; // pointer to IModule IDisplay * m_pIDisplay; // pointer to IDisplay AEEHANDLER pAppHandleEvent; #ifdef SDK_BETA_1003 AppletData m_AppData; #else PFNFREEAPPDATA pFreeAppData; #endif };이 구조체의 정보를 굳이 외울 필요까지는 없지만, 주목하고 넘어가야 하는 부분은 반드시 ClassID 를 포함한다는 부분과 애플릿이 생성될 때는 기본적으로 ISHELL, IMODULE, IDISPLAY 클래스를 포함한다는 점만 기억하면 될 것이다.
typedef struct _CIFileApp { AEEApplet a; IFileMgr * m_pIFileMgr; IFile * m_pIFile; } CIFileApp;여기서 한가지 의문을 가질 수 있다. 왜 이런 구조체를 미리 정의하고 시작하는 것인가? 답은 여러가지가 있을 수 있지만, 첫번째 이유는 효율적인 메모리 관리를 위해서이다. brew 를 사용하는 프로그래밍은 핸드폰에서 동작하는 애플리케이션들이다. 따라서 제한된 하드웨어적 자원을 사용할 수밖에 없는데 미리 사용될 메모리에 대한 계획을 세워두면 좀더 효율적으로 자원 관리를 할 수 있는 것이다. 두번째 부가적인 이로움이 있는 것은 프로그래밍에서 누차 이야기되는 보기 쉽고 읽기 쉬운 프로그램이 될 수 있기 때문이다. 이론적인 부분에 대해서는 필자보다 더 고수인 분들이 많을 것 같아서 더 이상의 자세한 설명은 줄이도록 하겠다. 하여튼 퀄콤 측에서는 애플릿의 형태를 이런 식으로 미리 구조화된 데이터를 정의해서 처리하도록 유도하고 있는 것만은 사실이다. | ||||||||||
4. 전체 프로그램 구조
| ||||||||||
파일 애플릿의 구조를 알아보기에 앞서 MIF 파일을 만들 때 주의할 사항을 하나 짚고 넘어가도록 하겠다. 지금 만들려고 하는 파일 애플릿은 IFileMgr 와 IFile 클래스를 사용하는데, 이 클래스들을 사용할 때에는 반드시 mif 편집기에서 파일의 권한 수준이 파일 이상이어야 한다. 다음 그림을 참조하도록 하고, 여기서는 편의상 모든 권한 수준으로 설정한다.
이제 파일 애플릿에서 필요한 함수들을 알아보자. 프로그램을 짜는 사람에 따라서 조금씩 틀릴 수도 있지만 필자는 다음과 같은 함수를 작성했다.
// 핸들 이벤트 콜백함수 정의 static boolean FileApp_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam); // 애플릿 시작시와 끝날 때 할 일을 수행하는 함수 static boolean IFile_InitAppData(IApplet* pMe); static void IFile_FreeAppData(IApplet* pMe); // 파일 관련 에러 처리 함수 void DG_FileErr(CIFileApp * pMe); 파일을 처리하는 절차는 첫째로 IFILEMGR 클래스를 사용하기 위한 인스턴스를 생성하고, 두번째로 생성된 인스턴스를 사용해서 파일을 연 후에, 세번째로 읽기, 쓰기 등등의 필요한 작업을 수행한 후에, 네번째로 사용한 파일을 닫고, 끝으로 IFILEMGR 인스턴스를 해제하는 순서이다. 말이 길어서 좀 복잡해 보이므로 다시 정리해보겠다.
3. 파일 읽기(쓰기) : IFILE_Read(pMe->m_pIFile, pBuffer, dwCount); 혹은 IFILE_WRITE 4. 파일 닫기 : IFILE_Release(pMe->m_pIFile); 5. IFILEMGR 인스턴스 해제 : IFILEMGR_Release(pMe->m_pIFileMgr); | ||||||||||
5. 완성된 소스
| ||||||||||
애플릿의 전체적인 구조를 알아보았으므로 완성된 소스를 게재하도록 하겠다. <소스파일 : ifileusage.c>
별반 어려운 내용은 없을 것이다. 프로그램의 대부분은 50~129 행인 FileApp_HandleEvent에서 처리된다. 특히 애플릿이 시작할 때 모든 처리가 이루어지므로 EVT_APP_START 부분에서 처리되는 것이다. 58~59행에서는 읽기와 쓰기 작업을 할 파일의 이름을 정의한다. 66~67행에서 IFILEMGR 클래스의 인스턴스를 생성하고 71행에서 파일을 읽기 모드로 연다. 76행이 파일에서 데이터를 바이트로 읽어들이는 부분이다. 86행에서 사용한 파일을 닫아준다. 94~121행까지의 부분은 읽기와 같은 순서로 파일에 쓰기를 보여주고 있다.
typedef enum { _OFM_READ=0x0001, _OFM_READWRITE=0x0002, _OFM_CREATE=0x0004, _OFM_APPEND=0x0008, _OFM_NO_BUFFER=0x8000} OpenFileMode; 이 중에서 실제 사용되는 것은 _OFM_NO_BUFFER를 제외한 네가지로서 다음과 같다.
나머지 함수들은 API Reference 문서를 찾아보면 상세한 설명이 나와 있으므로 생략하기로 한다. 다만 한가지 강조할 사항은 IFile를 사용하여 열었던 파일은 반드시 IFILE_Release() 함수를 사용해서 닫아주어야 한다. 그렇지 않으면 메모리 누수에 대한 경고 메시지를 피할 수 없을 것이다.
| ||||||||||
6. 실행 결과
| ||||||||||
컴파일을 마치고 실행을 하면 다음과 같은 화면이 나온다.
또한 ifile 디렉토리를 열어보면 write.txt 파일이 다음과 같은 내용으로 들어있을 것이다.
write.txt 파일을 삭제하지 않은 상태에서 애플릿을 다시 실행하면 같은 내용이 한 줄씩 더 생긴다. 그 이유는 쓰기 모드로 파일을 열 때에 파일이 없으면 생성이 되도록 하고 있는 경우에는 APPEND 모드로 열게 작성되어 있기 때문이다. | ||||||||||
7. 마무리
| ||||||||||
이번 장에서는 파일을 사용하는 예제를 알아보았다. 앞서 강좌를 진행했던 방식을 조금 바꾸어 소스 위주로 강좌가 진행되어서 좀 당황하셨을 수도 있겠지만, 그다지 어렵진 않으므로 모두들 쉽게 따라하실 수 있을 것이라 보인다.
|
글쓴 이 : 신동길 (tostar25@orgio.net) 글쓴 날 : 2002년 3월 5일 본 문서에 대한 모든 권한은 글쓴 사람에게 있으며, 수정 삭제에 관한 권리를 포함한다. 본 문서는 비상업적인 용도로는 수정되지 않은 상태로 자유롭게 배포할 수 있으나 반드시 본 저작권 관련 사항을 명시해야 한다. 본 문서에 포함된 내용에 대해 잘못된 사항에 대해서는 언제든지 저자의 e-Mail 로 보내면 수정/ 보완할 것이다. |
첫댓글 좋은 게시물이네요. 스크랩 해갈게요~^^
좋은 게시물이네요. 스크랩 해갈게요~^^