How to build the BONDI RI(Reference Implementation).

04/09/2010

지난 bondi RI 에서는 bondi에서 배포하는 버전을 설치하고 실행하는 부분에 대해서 다루었습니다.

이번에는 bondi RI의 소스를 build 해서 실행하는 방법에 대해서 알아보겠습니다.

1. windows mobile 개발 환경 구성

bondi RI는 windows mobile 환경에서 설치 및 실행되므로 아래 개발 환경이 우선 설치 되어야 합니다.

– visual studio 2005 Professional or Team system editions

– windows mobile 6 professional SDK

visual studio 2005에서는 professtional 이상의 버전을 사용해서 windows mobile 개발이 가능합니다. 이 버전 이상이 설치 되어있다면 windows mobile 6 professional SDK를 mircosoft site에서 다운로드 받아 설치합니다. (다운로드 바로 가기)

2. bondi RI source

개발 환경이 구축되면 이제 bondi RI 소스와 bondi RI의 구동에 필요한 webvm SDK를 설치합니다.

omtp에서는bondi RI의 소스를 svn으로 관리를 하므로 svn에 필요한 client 프로그램을 설치하면 아래 주소에서 받을 수 있습니다. 필자는 윈도우용 svn client인 tortoisesvn 를 이용했습니다.

http://svn.omtp.org:8080/svn/bondi/trunk

현재 svn에는 인증을 필요로 합니다.  bondi development site에 회원가입을 하고 가입 확인 메일을 받으면 가입한 ID/PW로 인증이 가능합니다.

3. webvm SDK

webvm은 browser에서 PIM, Geolocation 등의 native feature를 사용하기 일종의 plug-in 입니다. bondi APIs에서는 다양한 종류의 native featrue를 사용하므로 browser에서 이 부분을 연결하기 위해서 bondi RI(windows mobile)에서는 webvm을 이용합니다.  그러므로 bondi RI를 build 하기 위해서는 webvm SDK가 필요합니다.

webvm에 대한 상세 내용은 http://webvm.net/ 를 참고하십시오.

그럼 이제 build 필요한 마지막 부분인 webvm SDK를 설치해야 합니다.  http://sdk.webvm.net/에서 이름, 메일 정보등을 입력하고면 메일로 다운로드 가능한 주소를 보내줍니다. ( 테스트용으로 받기위해서 요청을 했을 때 답변 메일에 3시간 정도가 소요되었습니다.)

다운로드 SDK의 압축을 풉니다. 그리고 아래의 경로를 windows 경로에 추가합니다.

WEBVMHOME=C:\path\to\your\webvm-sdk

이 경로의 include/webvm.h 파일을 이용하기 위한 내용이므로 꼭 추가해 주어야 합니다.

4. build

모든 환경이 준비 되었으면 visual studio 로  {bondi RI source path}\ri\build\wince\build.sln 프로젝트를 load하고 target을 Windows Mobile 6 Professional SDK (ARMV4I) 로 설정한 다음 build를 실행합니다.

bondi RI는 지속적인 수정이 되고 있는 상태이기 때문에 build 에 대해서 관리가 되지 않아서 무수한 에러와 만나게 될지도 모릅니다. 그럼에도 build 해서 실제 실행되는 부분을 확인하기 위해서는 에러를 직접 해결해야 합니다. : p

2010.04.01 기준의 소스를 받았을 때 발생한 에러에 대해서는 아래 내용을 적용하면 정상적으로 build가 되니 참고하십시오.

– fixed build error

  • C:\Program Files\Microsoft Visual Studio 8\VC\ce\include\comdef.h (240 line) 을 수정.  int nLen = ::lstrlen(m_pszMsg);   부분을 다음으로 변경   int nLen = lstrlen(m_pszMsg);
  • C:\path\to\your\webvm-sdk\include\webvm.h 파일을 {bondi RI source path}\ri\module\common\webvm.h 파일로 교체
  • MessagingCommon project 를 삭제하고 {bondi RI source path}\ri\module\common\messagingCommon2\wince\messagingCommon.vcproj 를 새로운 project로 Add. 추가로 WCommsLog project properties -> input lib에서 messsagingCommon을 messagingCommon2로 변경.
  • bondi_FeatureCallback_decl.h 를 include 한 부분 주석 처리

2010.04.01 소스는 위에 부분의 수정으로 build가 가능합니다.

5. Run bondi RI

이상 없이 build 가 완료되면 {bondi RI source path}\ri\build\wince\bin\ 아래에 BondiSetup1-016d.cap 파일이 생성됩니다. 이 설치 파일을 windows mobile emulator에서 설치하면 정상적으로 bondi RI가 실행되는 것을 확인할 수 있습니다.

참고로 아래 부분을 수정하면 debug mode로 emulator에서 실행도 가능합니다. (마찬가지로 2010.04.01 소스 기준으로 추후에 다르게 변경 될 수 있습니다.)

  • userAgent project를 Set as Startup project로 선택
  • package project properties -> Deployment -> Register Output No로 변경
  • userAgent project properties -> Deployment -> Remote Directory를 %CSIDL_PROGRAM_FILES%\bondi 로 변경

6. conclusion

bondi 에서 배포하는 RI source는 계속적인 수정과 버전 관리 process의 부재로  build & run 에는 아직 여러가지 문제들이 있습니다. 그렇지만 bondi APIs 의 내부적인 동작에 대해서 관심이 있다면 현재 참고할 수 있는 유일한 reference입니다.

Advertisements

bondi RI(Reference Implementation)

02/22/2010

bondi에서 배포하는  RI(Reference Implementation)를 이용해서 윈도의 환경의 PC에서 widget을 실행 테스트하기 위한 환경설정을 해 보겠습니다.

1. windows mobile  6.x  emulator install

windows mobile 개발자라면 visual studio가 설치된 상태에서 window mobile SDK를 이용해서 emulator 실행을 간단히 할 수있겠지만 windows mobile 개발 환경이 없는 상황에서도 실행할 수 있는 Device Emulator를 이용하는 방법을 설명하겠습니다.

우선 아래 두 가지를 다운로드 받습니다.

– Microsoft Device Emulator 3.0 – Standalone Release

– Windows Mobile 6 Localized Emulator Images : 해당 지역의 emulator 이미지를 다운로드.

Device emulator는 windows mobile emulator 이미지를 실행하기 위한 툴입니다. 그리고 bondi RI가 windows mobile 6 이상을 지원하므로 그 이상의 emulator 이미지를 설치합니다.

정상적으로 설치가 되었다면 Device emulator와 windows mobile 6 이미지는 아래 각각의 디렉토리에 있게 됩니다.

– Device emulator 실행 경로 : C:\Program Files\Microsoft Device Emulator\1.0

– windows mobile 6 이미지 경로 : C:\Program Files\Windows Mobile 6 SDK\PocketPC\Deviceemulation

windows mobile 6이미지 아래의 경로를 보면 \ 0412디렉토리 아래에 이미지 파일들과  Pocket_PC_XXX 라는 이름의 이미지 스킨 파일들이 있습니다.

이제 Device emulator 설치 경로에 있는 DeviceEmulator.exe를 이용해서 이 중 하나의 이미지를 실행해 보겠습니다.

DeviceEmulator.exe는 command 기반의 프로그램입니다.  아래와 같이 옵션을 주고 실해을 합니다.

C:\Program Files\Microsoft Device Emulator\1.0\DeviceEmulator.exe” {이미지 파일의 경로} /skin {스킨 xml 파일 경로} /memsize 256

여기서 이미지 파일의 위에 설명한 것과 같이 \ 0412 디렉토리 아래의 이미지이름이며 스킨 xml 파일은 \Pocket_PC_XXX 아래에 있는 xml 파일의 경로를 지정합니다.  옵션들이 정확하다면 아래와 같은 emulator가 실행됩니다. 상세한 옵션은 DeviceEmulator.exe /? 로 확인하시면 됩니다.

이제 위의 emulator 기반에서 bondi RI를 설치하고 실행해 보겠습니다.

2. bondi RI install

bondi RI는 아래의 링크에서 다운로드 합니다.

– bondi RI : email을 등록하고 라이센스에 동의하면 email로 download 링크가 전송됩니다.

다운 로드 받은 파일의 압축을 풀면 BONDI 1.0 (alpha) SDK\Phone Distribution\BondiSetup1-006.CAB 파일을  windows mobile에 전송을 합니다. 전송은 windows mobile emulator의 File > configuration > general tab에서 Shared folder 기능을 이용하면 됩니다.

BondiSetup1-006.CAB 파일의 설치는 일반 windows mobile 프로그램 설치 방법과 동일합니다.

설치과 완료되면 windows mobile emulator의 프로그램에 Bondi라는 항목이 생성되고 실행을 하면 아래와 같은 화면이 나오게 됩니다.

bondi API 를 테스트 하고 실행하기 위해서 bondi RI를 windows mobile 환경에서 실행해 보았습니다. bondi API를 실행 테스트하기 위해서는 이외에 몇가지 다른 방법이 있는데 이는 reference link의 주소를 참고하십시오.

3. Reference Link

Bondi develping widgets : http://bondi.omtp.org/usebondi/Webpages/devtools.aspx


윈도우즈 모바일에 구현된 레퍼런스

02/08/2010

BONDI에는 RI(Reference Implementation) 라고 하는 윈도우즈 모바일에 구현된 레퍼런스가 존재합니다. 즉, 위젯을 만들어서 직접 윈도우즈 모바일 환경에서 돌려볼 수 있는 것이죠.

RI에대한 자세한 설명은 다음에 하도록 하겠습니다. 이 번 글은 RI가 윈도우즈 모바일 위에 구현되었는데, 윈도우즈 모바일에 사용되는 IE 모바일 브라우저로 인해 생기는 여러 한계점들(혹은 그 것을 우회하여 해결하는 방법)에 대해서 얘기해보고자 합니다.

원문 : http://code.google.com/intl/ko/apis/gears/mobile.html 

CSS

position 속성을 지원하지 않아서, 임의의 위치로 이동시킬 수 가 없다.

Document Object Model

Document Element 접근하기

IE Mobile 5버전에서는 document.getElementById()를 지원하지 않아서 아래와 같이 document.all 을 사용하는 해결책이 있다.

/**
 * Tests if an element is defined.
 * @param type - The type of the element to be tested.
 */
function isDefined(type) {
  return type != 'undefined' && type != 'unknown';
}

/**
 * Retrieve a DOM element by its ID.
 * @param id - The ID of the element to locate.
 */
function getDOMElementById(id) {
  if (isDefined(typeof document.getElementById)) {
     return document.getElementById(id);
  } else if (isDefined(typeof document.all)) {
     return document.all[id];
  } else {
    throw new Error("Can not find a method to locate DOM element.");
    return null;
  }
}

Document Element 만들기

마찬가지로, IE Mobile 5 버전에서는 createElement를 지원하지 않아서, innerHTML 을 사용하여 아래와 같이 해결해야 하네요.

node.innerHTML = "<p id='myElement'></p>";

Element 에 Text 설정하기

IE Mobile 5 버전에서 createTextNode를 지원하지 않아서, innerText 를 대신 사용해야 합니다.

function setElementText(node, text) {
 if (isDefined(typeof node.innerText)) {
   node.innerText = text;
 } else {
   while (node.firstChild) {
     node.removeChild(node.firstChild);
   }
   node.appendChild(document.createTextNode(text));
 }
}

Document Element 수정하기

innerHTML과 innerText를 사용하라고 합니다.

ActiveX : object 관련 문제점들

IE Mobile 에서는 아래와 같이 window object에 대한 확장을 지원하지 않습니다.

window.myObject = new Array(); // Does not work!

이에 대한 해결 방법으로는 아래와 같이 myObject를 선언해 주는 것 입니다.

myObject = new Array();
alert(window.myObject);       // OK!

그리고, 아래와 같이 안전하게 define 여부를 확인 후에 사용해야 합니다.

if (isDefined(typeof myObject.askQuestion)) {
  myObject.askQuestion(42);
}

아래는 myObject가 ActiveX라면 문제가 될 수 있습니다.

if (myObject.askQuestion) {
  myObject.askQuestion(42);
}

Recursion

IE Mobile 5 및 6 버전에서는 call stack 제한( 16 function call)을 두었기 때문에, 그 이상의 function call은 무시되니, recursion이 발생하지 않도록 만들어야 합니다.

Layout Refresh

IE Mobile 에서는 DOM node가 dynamic 하게 추가 될 때, 페이지를 올바르게 refresh 하지 못할 경우가 있습니다.  예를들어, table의 일부 element가 변경될 경우라도, 전체 table element에 대해서 처리하도록 해줘야 합니다.

MSDN 자료

아래 링크들에 IE 모바일 개발 관련 유용한 정보가 있으니, 추가적으로 참고하시기 바랍니다.