[Application] Ported implementation.
authorTomasz Marciniak <t.marciniak@samsung.com>
Fri, 24 Apr 2015 10:11:29 +0000 (12:11 +0200)
committerPawel Andruszkiewicz <p.andruszkie@samsung.com>
Fri, 24 Apr 2015 12:20:45 +0000 (21:20 +0900)
[Verification] Code compiles without errors.
TCT passrate 100% 159(159/0/0/0)

Change-Id: Ic455f8db44f343e3887510b088f1024f6c9dae05
Signed-off-by: Tomasz Marciniak <t.marciniak@samsung.com>
25 files changed:
src/application/application.cc
src/application/application.gyp
src/application/application.h
src/application/application_api.js
src/application/application_certificate.cc [deleted file]
src/application/application_certificate.h [deleted file]
src/application/application_context.cc [deleted file]
src/application/application_context.h [deleted file]
src/application/application_control.cc [deleted file]
src/application/application_control.h [deleted file]
src/application/application_controldata.cc [deleted file]
src/application/application_controldata.h [deleted file]
src/application/application_extension.cc
src/application/application_information.cc [deleted file]
src/application/application_information.h [deleted file]
src/application/application_instance.cc
src/application/application_instance.h
src/application/application_manager.cc [new file with mode: 0644]
src/application/application_manager.h [new file with mode: 0644]
src/application/application_metadata.cc [deleted file]
src/application/application_metadata.h [deleted file]
src/application/application_utils.cc [new file with mode: 0644]
src/application/application_utils.h [new file with mode: 0644]
src/application/requested_application_control.cc
src/application/requested_application_control.h

index d8151071de65ee4d1711349b81f7c1f87c3051aa..b5ae237a6d1d708083398ed6a2a83daa9c30851f 100644 (file)
@@ -6,57 +6,40 @@
 
 #include "common/extension.h"
 #include "common/logger.h"
-#include "common/picojson.h"
-
 #include "common/platform_result.h"
 
-using common::ErrorCode;
+using namespace common;
+using namespace tools;
 
 namespace extension {
 namespace application {
 
-Application::Application() {
-}
-
-Application::~Application() {
-}
-
-void Application::Hide() {
-}
-
-void Application::Exit() {
+RequestedApplicationControl& Application::app_control() {
+    return app_control_;
 }
 
-std::string Application::get_context_id() {
-  return context_id_;
-}
+void Application::GetRequestedAppControl(const picojson::value& args, picojson::object* out) {
+  LoggerD("Entered");
 
-void Application::set_context_id(const std::string& context_id) {
-  context_id_ = context_id;
-}
+  const std::string& encoded_bundle =
+      GetCurrentExtension()->GetRuntimeVariable("encoded_bundle", 1024);
 
-ApplicationInformationPtr Application::get_app_info() const {
-  return app_info_;
-}
+  picojson::value result = picojson::value(picojson::object());
 
-void Application::set_app_info(const ApplicationInformationPtr& app_info) {
-  app_info_ = app_info;
-}
+  if (!encoded_bundle.empty()) {
+    PlatformResult ret = app_control_.set_bundle(encoded_bundle);
+    if (ret.IsError()) {
+      ReportError(ret, out);
+      return;
+    }
 
-const picojson::value& Application::Value() {
-  if (!app_info_->IsValid()) {
-    LoggerD("ErrorCode::UNKNOWN_ERR");
-    picojson::object obj;
-    obj["error"] = picojson::value(static_cast<double>(ErrorCode::UNKNOWN_ERR));
-    value_ = picojson::value(obj);
+    app_control_.ToJson(&result.get<picojson::object>());
   } else {
-    picojson::object obj;
-    LoggerD("Value returns appInfo, contextId");
-    obj["appInfo"] = app_info_->Value();
-    obj["contextId"] = picojson::value(context_id_);
-    value_ = picojson::value(obj);
+    LoggerD("bundle string is empty.");
+    result = picojson::value();
   }
-  return value_;
+
+  ReportSuccess(result, *out);
 }
 
 }  // namespace application
index 62a83855a1c5b606f895150c9c0c606038451a5e..24d8fbe247ee00ef9abe77bec93188ad6e3662f4 100644 (file)
         'application_instance.h',
         'application.cc',
         'application.h',
-        'application_information.cc',
-        'application_information.h',
-        'application_context.cc',
-        'application_context.h',
-        'application_metadata.cc',
-        'application_metadata.h',
-        'application_certificate.cc',
-        'application_certificate.h',
-        'application_control.cc',
-        'application_control.h',
-        'application_controldata.cc',
-        'application_controldata.h',
+        'application_manager.cc',
+        'application_manager.h',
+        'application_utils.cc',
+        'application_utils.h',
         'requested_application_control.cc',
         'requested_application_control.h',
       ],
index 257606cb759790ae6778b6fce5d920392a75ea41..48694a46a93c923ab41ebc19ab6684047dd08fa7 100644 (file)
@@ -8,38 +8,19 @@
 #include <string>
 #include <memory>
 
-#include "application/application_information.h"
+#include "common/picojson.h"
+#include "application/requested_application_control.h"
 
 namespace extension {
 namespace application {
 
-class Application;
-typedef std::shared_ptr<Application> ApplicationPtr;
-
 class Application {
  public:
-  Application();
-  ~Application();
-
-  void Hide();
-  void Exit();
-
-  const picojson::value& Value();
-  bool IsValid() const;
-
-  std::string get_context_id();
-  void set_context_id(const std::string& context_id);
-
-  ApplicationInformationPtr get_app_info() const;
-  void set_app_info(const ApplicationInformationPtr &appInfo);
+  RequestedApplicationControl& app_control();
+  void GetRequestedAppControl(const picojson::value& args, picojson::object* out);
 
  private:
-  std::string context_id_;
-  ApplicationInformationPtr app_info_;
-
-  picojson::object data_;
-  picojson::object error_;
-  picojson::value value_;
+  RequestedApplicationControl app_control_;
 };
 
 }  // namespace application
index 388dbcf3c707a4c40bdaf3542013b163fe8b89ed..950dc915157836d8b6360c053eac8c27f9da0d72 100644 (file)
-/* global tizen, xwalk, extension */
+//Copyright 2015 Samsung Electronics Co, Ltd. All rights reserved.
+//Use of this source code is governed by a BSD-style license that can be
+//found in the LICENSE file.
 
-// Copyright 2015 Samsung Electronics Co, Ltd. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
+var T = xwalk.utils.type;
+var Converter = xwalk.utils.converter;
+var AV = xwalk.utils.validator;
 
-
-var validator_ = xwalk.utils.validator;
-var types_ = validator_.Types;
-var native_ = new xwalk.utils.NativeManager(extension);
+var native = new xwalk.utils.NativeManager(extension);
 
 var ApplicationControlLaunchMode = {
   SINGLE: 'SINGLE',
   GROUP: 'GROUP'
 };
 
-function callNative(cmd, args) {
-  var result = native_.callSync(cmd, args);
-
-  if (typeof result !== 'object') {
-    throw new WebAPIException(WebAPIException.UNKNOWN_ERR);
-  }
-
-  if (native_.isSuccess(result)) {
-    if (native_.getResultObject(result)) {
-      return native_.getResultObject(result);
-    }
-    return true;
-  } else {
-    if (result.error) {
-      throw native_.getErrorObject(result);
-    }
-    return false;
+// helper functions ////////////////////////////////////////////////////
+function _createApplicationControlData(object) {
+  var ret;
+  if (!T.isNullOrUndefined(object)) {
+    ret = new tizen.ApplicationControlData(object.key, object.value);
   }
+  return ret;
 }
 
-function callNativeWithCallback(cmd, args, callback) {
-  return native_.call(cmd, args, callback);
-}
-
-function setReadOnlyProperty(obj, n, v) {
-  Object.defineProperty(obj, n, {'value': v, 'writable': false});
+function _createApplicationControlDataArray(object) {
+  var ret = [];
+  if (!T.isNullOrUndefined(object) && T.isArray(object)) {
+    object.forEach(function (o) {
+      var data = _createApplicationControlData(o);
+      if (!T.isNullOrUndefined(data)) {
+        ret.push(data);
+      }
+    });
+  }
+  return ret;
 }
 
-function defineReadWriteProperty(object, key, value) {
-  Object.defineProperty(object, key, {
-    enumerable: true,
-    writable: true,
-    value: value
-  });
+function _createApplicationControl(object) {
+  var ret;
+  if (!T.isNullOrUndefined(object)) {
+    ret = new tizen.ApplicationControl(object.operation,
+        object.uri,
+        object.mime,
+        object.category,
+        _createApplicationControlDataArray(object.data));
+  }
+  return ret;
 }
 
-function defineReadWriteNonNullProperty(object, key, value) {
-  var hvalue = value;
-  Object.defineProperty(object, key, {
-    enumerable: true,
-    set: function(val) {
-      if (val !== null && val !== undefined) {
-        hvalue = val;
+function _createApplicationInformationArray(object) {
+  var ret = [];
+  if (!T.isNullOrUndefined(object) && T.isArray(object)) {
+    object.forEach(function (o) {
+      var data = new ApplicationInformation(o);
+      if (!T.isNullOrUndefined(data)) {
+        ret.push(data);
       }
-    },
-    get: function() {
-      return hvalue;
-    }
-  });
-}
-
-function ApplicationManager() {
-  // constructor of ApplicationManager
+    });
+  }
+  return ret;
 }
 
-function getAppInfoWithReadOnly(obj) {
-  var appInfo = new ApplicationInformation();
-  setReadOnlyProperty(appInfo, 'id', obj.id);
-  setReadOnlyProperty(appInfo, 'name', obj.name);
-  setReadOnlyProperty(appInfo, 'iconPath', obj.iconPath);
-  setReadOnlyProperty(appInfo, 'version', obj.version);
-  setReadOnlyProperty(appInfo, 'show', obj.show);
-  setReadOnlyProperty(appInfo, 'categories', obj.categories);
-  setReadOnlyProperty(appInfo, 'installDate', new Date(obj.installDate));
-  setReadOnlyProperty(appInfo, 'packageId', obj.packageId);
-
-  Object.defineProperty(appInfo, 'size', {
-    get: function () {
-      xwalk.utils.checkPrivilegeAccess('http://tizen.org/privilege/application.info');
-      return obj.size;
-    },
-    set: function (value) {},
-    enumerable: true
-  });
+// class ApplicationManager ////////////////////////////////////////////////////
+var ApplicationManager = function() {
+};
 
-  return appInfo;
-}
 ApplicationManager.prototype.getCurrentApplication = function() {
-  var nativeParam = {
-  };
+  var result = native.callSync('ApplicationManager_getCurrentApplication', {});
 
-  try {
-    var syncResult = callNative('ApplicationManager_getCurrentApplication', nativeParam);
-  } catch (e) {
-    throw e;
+  if (native.isFailure(result)) {
+    throw native.getErrorObject(result);
+  } else {
+    return new Application(native.getResultObject(result));
   }
-
-  var appInfo = getAppInfoWithReadOnly(syncResult.appInfo);
-  var app = new Application();
-  setReadOnlyProperty(app, 'appInfo', appInfo);
-  setReadOnlyProperty(app, 'contextId', syncResult.contextId);
-  return app;
 };
 
-ApplicationManager.prototype.kill = function(contextId, successCallback, errorCallback) {
-  var args = validator_.validateArgs(arguments, [
-    {'name': 'contextId', 'type': types_.STRING},
-    {'name': 'successCallback', 'type': types_.FUNCTION, 'optional': true, 'nullable': true},
-    {'name': 'errorCallback', 'type': types_.FUNCTION, 'optional': true, 'nullable': true}
+ApplicationManager.prototype.kill = function() {
+  var args = AV.validateMethod(arguments, [
+      {
+        name : 'contextId',
+        type : AV.Types.STRING
+      },
+      {
+        name : 'successCallback',
+        type : AV.Types.FUNCTION,
+        optional : true,
+        nullable : true
+      },
+      {
+        name : 'errorCallback',
+        type : AV.Types.FUNCTION,
+        optional : true,
+        nullable : true
+      }
   ]);
 
-  var nativeParam = {
-    'contextId': args.contextId
+  var callback = function(result) {
+    if (native.isFailure(result)) {
+      native.callIfPossible(args.errorCallback, native.getErrorObject(result));
+    } else {
+      native.callIfPossible(args.successCallback);
+    }
   };
 
-  try {
-    var syncResult =
-        callNativeWithCallback('ApplicationManager_kill', nativeParam, function(result) {
-      if (native_.isSuccess(result)) {
-        native_.callIfPossible(args.successCallback);
-      } else {
-        native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
-      }
-    });
-    if (native_.isFailure(syncResult)){
-      var error = native_.getErrorObject(syncResult);
-      if (error.code === WebAPIException.NOT_FOUND_ERR
-            || error.code === WebAPIException.INVALID_VALUES_ERR
-            || error.code === WebAPIException.UNKNOWN_ERR) {
-        setTimeout(function() {
-          native_.callIfPossible(args.errorCallback, error);
-        }, 0);
-        return;
-      }
-      throw error;
-    }
-  } catch (e) {
-    throw e;
+  var result = native.call('ApplicationManager_kill', {contextId: args.contextId}, callback);
+
+  if (native.isFailure(result)) {
+    throw native.getErrorObject(result);
   }
 };
 
-ApplicationManager.prototype.launch = function(id, successCallback, errorCallback) {
-  var args = validator_.validateArgs(arguments, [
-    {'name': 'id', 'type': types_.STRING},
-    {'name': 'successCallback', 'type': types_.FUNCTION, 'optional': true, 'nullable': true},
-    {'name': 'errorCallback', 'type': types_.FUNCTION, 'optional': true, 'nullable': true}
+ApplicationManager.prototype.launch = function() {
+  var args = AV.validateMethod(arguments, [
+      {
+        name : 'id',
+        type : AV.Types.STRING
+      },
+      {
+        name : 'successCallback',
+        type : AV.Types.FUNCTION,
+        optional : true,
+        nullable : true
+      },
+      {
+        name : 'errorCallback',
+        type : AV.Types.FUNCTION,
+        optional : true,
+        nullable : true
+      }
   ]);
 
-  var nativeParam = {
-    'id': args.id
+  var callback = function(result) {
+    if (native.isFailure(result)) {
+      native.callIfPossible(args.errorCallback, native.getErrorObject(result));
+    } else {
+      native.callIfPossible(args.successCallback);
+    }
   };
 
-  try {
-    var syncResult =
-        callNativeWithCallback('ApplicationManager_launch', nativeParam, function(result) {
-      if (native_.isSuccess(result)) {
-          native_.callIfPossible(args.successCallback);
-      } else {
-          native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
-      }
-    });
-  } catch (e) {
-    throw e;
+  var result = native.call('ApplicationManager_launch', {id: args.id}, callback);
+
+  if (native.isFailure(result)) {
+    throw native.getErrorObject(result);
   }
 };
 
-ApplicationManager.prototype.launchAppControl = function(appControl, id, successCallback,
-    errorCallback, replyCallback) {
-  var args = validator_.validateArgs(arguments, [
-    {'name': 'appControl', 'type': types_.PLATFORM_OBJECT, 'values': tizen.ApplicationControl},
-    {'name': 'id', 'type': types_.STRING, 'optional': true, 'nullable': true},
-    {'name': 'successCallback', 'type': types_.FUNCTION, 'optional': true, 'nullable': true},
-    {'name': 'errorCallback', 'type': types_.FUNCTION, 'optional': true, 'nullable': true},
-    {'name': 'replyCallback', 'type': types_.LISTENER, 'values': ['onsuccess', 'onfailure'],
-      'optional': true, 'nullable': true}
+ApplicationManager.prototype.launchAppControl = function() {
+  var args = AV.validateMethod(arguments, [
+      {
+        name : 'appControl',
+        type : AV.Types.PLATFORM_OBJECT,
+        values : tizen.ApplicationControl
+      },
+      {
+        name : 'id',
+        type : AV.Types.STRING,
+        optional : true,
+        nullable : true
+      },
+      {
+        name : 'successCallback',
+        type : AV.Types.FUNCTION,
+        optional : true,
+        nullable : true
+      },
+      {
+        name : 'errorCallback',
+        type : AV.Types.FUNCTION,
+        optional : true,
+        nullable : true
+      },
+      {
+        name : 'replyCallback',
+        type : AV.Types.LISTENER,
+        values : ['onsuccess', 'onfailure'],
+        optional : true,
+        nullable : true
+      }
   ]);
 
-  var nativeParam = {
+  var replyCallbackId = 'ApplicationControlDataArrayReplyCallback_' + new Date().valueOf();
+  var registeredReplyCallback = function(result) {
+    if (native.isFailure(result)) {
+      native.callIfPossible(args.replyCallback.onfailure);
+    } else {
+      native.callIfPossible(args.replyCallback.onsuccess,
+          _createApplicationControlDataArray(result.data));
+    }
+    native.removeListener(replyCallbackId, registeredReplyCallback);
+  };
+
+  var callback = function(result) {
+    if (native.isFailure(result)) {
+      native.callIfPossible(args.errorCallback, native.getErrorObject(result));
+      native.removeListener(replyCallbackId, registeredReplyCallback);
+    } else {
+      native.callIfPossible(args.successCallback);
+    }
   };
-  if (args['id']) {
-    nativeParam['id'] = args.id;
-  }
-  if (args['appControl']) {
-    nativeParam['appControl'] = args.appControl;
+
+  var callArgs = {};
+  callArgs.appControl = args.appControl;
+  if (args.has.id) {
+    callArgs.id = args.id;
   }
-  if (args.appControl['launchMode'] ) {
-      nativeParam['launchMode'] = args.appControl['launchMode'];
+  if (args.has.replyCallback) {
+    callArgs.replyCallback = replyCallbackId;
+    native.addListener(replyCallbackId, registeredReplyCallback);
   }
 
-  //Try to find application
-  try {
-      if (args['id']) {
-        this.getAppInfo(args.id);
-      }
-  } catch(e) {
-      //If app cannot be found, it should all errorCallback with NotFoundException.
-      setTimeout(function() {
-          native_.callIfPossible(args.errorCallback, e);
-      }, 0);
-  }
-
-  try {
-    var syncResult =
-        callNativeWithCallback('ApplicationManager_launchAppControl', nativeParam, function(ret) {
-      // In case of reply, can have onsuccess or onfailure with result.status
-      // It should be checked first of all
-      if (ret.type === 'onsuccess') {
-        if (args.replyCallback) {
-          args.replyCallback.onsuccess(ret.data);
-        }
-      }
-      else if (ret.type === 'onfailure') {
-        if (args.replyCallback) {
-          args.replyCallback.onfailure();
-        }
-      }
-      else if (ret.status === 'success') {
-        native_.callIfPossible(args.successCallback);
-      }
-      else if (ret.status === 'error') {
-        native_.callIfPossible(args.errorCallback, native_.getErrorObject(ret));
-      }
-    });
-  } catch (e) {
-    throw e;
+  var result = native.call('ApplicationManager_launchAppControl', callArgs, callback);
+
+  if (native.isFailure(result)) {
+    throw native.getErrorObject(result);
   }
 };
 
-ApplicationManager.prototype.findAppControl = function(appControl, successCallback, errorCallback) {
-  var args = validator_.validateArgs(arguments, [
-    {'name': 'appControl', 'type': types_.PLATFORM_OBJECT, 'values': tizen.ApplicationControl},
-    {'name': 'successCallback', 'type': types_.FUNCTION},
-    {'name': 'errorCallback', 'type': types_.FUNCTION, 'optional': true, 'nullable': true}
+ApplicationManager.prototype.findAppControl = function() {
+  var args = AV.validateMethod(arguments, [
+      {
+        name : 'appControl',
+        type : AV.Types.PLATFORM_OBJECT,
+        values : tizen.ApplicationControl
+      },
+      {
+        name : 'successCallback',
+        type : AV.Types.FUNCTION
+      },
+      {
+        name : 'errorCallback',
+        type : AV.Types.FUNCTION,
+        optional : true,
+        nullable : true
+      }
   ]);
 
-  var nativeParam = {
+  var callback = function(result) {
+    if (native.isFailure(result)) {
+      native.callIfPossible(args.errorCallback, native.getErrorObject(result));
+    } else {
+      var r = native.getResultObject(result);
+      args.successCallback(_createApplicationInformationArray(r.informationArray),
+          _createApplicationControl(r.appControl));
+    }
   };
-  if (args['appControl']) {
-    nativeParam['appControl'] = args.appControl;
-  }
-  try {
-    var syncResult =
-        callNativeWithCallback('ApplicationManager_findAppControl', nativeParam, function(result) {
-      if (native_.isSuccess(result)) {
-        var returnArray = [];
-        for (var i = 0; i < result.informationArray.length; i++) {
-          var appInfo = getAppInfoWithReadOnly(result.informationArray[i]);
-          returnArray.push(appInfo);
-        }
 
-        args.successCallback(returnArray, result.appControl);
-      } else if (native_.isFailure(result)) {
-        native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
-      }
-    });
-  } catch (e) {
-    throw e;
+  var callArgs = {appControl: args.appControl};
+  var result = native.call('ApplicationManager_findAppControl', callArgs, callback);
+
+  if (native.isFailure(result)) {
+    throw native.getErrorObject(result);
   }
 };
 
-ApplicationManager.prototype.getAppsContext = function(successCallback, errorCallback) {
-  var args = validator_.validateArgs(arguments, [
-    {'name': 'successCallback', 'type': types_.FUNCTION},
-    {'name': 'errorCallback', 'type': types_.FUNCTION, 'optional': true, 'nullable': true}
+ApplicationManager.prototype.getAppsContext = function() {
+  var args = AV.validateMethod(arguments, [
+      {
+        name : 'successCallback',
+        type : AV.Types.FUNCTION
+      },
+      {
+        name : 'errorCallback',
+        type : AV.Types.FUNCTION,
+        optional : true,
+        nullable : true
+      }
   ]);
 
-  var nativeParam = {
+  var callback = function(result) {
+    if (native.isFailure(result)) {
+      native.callIfPossible(args.errorCallback, native.getErrorObject(result));
+    } else {
+      var contexts = native.getResultObject(result).contexts;
+      var c = [];
+      contexts.forEach(function (i) {
+        c.push(new ApplicationContext(i));
+      });
+      args.successCallback(c);
+    }
   };
-  try {
-    var syncResult =
-        callNativeWithCallback('ApplicationManager_getAppsContext', nativeParam, function(result) {
-      if (native_.isSuccess(result)) {
-        var returnArray = [];
-        for (var index = 0; index < result.contexts.length; index++) {
-          var appContext = new ApplicationContext();
-          setReadOnlyProperty(appContext, 'id', result.contexts[index].id);
-          setReadOnlyProperty(appContext, 'appId', result.contexts[index].appId);
-          returnArray.push(appContext);
-        }
-        args.successCallback(returnArray);
-      }
-      else if (result.status === 'error') {
-        native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
-      }
-    });
-  } catch (e) {
-    throw e;
+
+  var result = native.call('ApplicationManager_getAppsContext', {}, callback);
+
+  if (native.isFailure(result)) {
+    throw native.getErrorObject(result);
   }
 };
 
-ApplicationManager.prototype.getAppContext = function(contextId) {
-  var args = validator_.validateArgs(arguments, [
-    {'name': 'contextId', 'type': types_.STRING, 'optional': true, 'nullable': true}
+ApplicationManager.prototype.getAppContext = function() {
+  var args = AV.validateMethod(arguments, [
+      {
+        name : 'contextId',
+        type : AV.Types.STRING,
+        optional : true,
+        nullable : true
+      }
   ]);
 
-  var nativeParam = {
-  };
-  if (args['contextId']) {
-    nativeParam['contextId'] = args.contextId;
-  }
-  try {
-    var syncResult = callNative('ApplicationManager_getAppContext', nativeParam);
-  } catch (e) {
-    throw e;
+  var callArgs = {};
+
+  if (args.has.contextId) {
+    callArgs.contextId = args.contextId;
   }
 
-  var returnObject = new ApplicationContext();
-  setReadOnlyProperty(returnObject, 'id', syncResult.id); // read only property
-  setReadOnlyProperty(returnObject, 'appId', syncResult.appId); // read only property
+  var result = native.callSync('ApplicationManager_getAppContext', callArgs);
 
-  return returnObject;
+  if (native.isFailure(result)) {
+    throw native.getErrorObject(result);
+  } else {
+    return new ApplicationContext(native.getResultObject(result));
+  }
 };
 
-ApplicationManager.prototype.getAppsInfo = function(successCallback, errorCallback) {
-  var args = validator_.validateArgs(arguments, [
-    {'name': 'successCallback', 'type': types_.FUNCTION},
-    {'name': 'errorCallback', 'type': types_.FUNCTION, 'optional': true, 'nullable': true}
+ApplicationManager.prototype.getAppsInfo = function() {
+  var args = AV.validateMethod(arguments, [
+      {
+        name : 'successCallback',
+        type : AV.Types.FUNCTION
+      },
+      {
+        name : 'errorCallback',
+        type : AV.Types.FUNCTION,
+        optional : true,
+        nullable : true
+      }
   ]);
 
-  var nativeParam = {
+  var callback = function(result) {
+    if (native.isFailure(result)) {
+      native.callIfPossible(args.errorCallback, native.getErrorObject(result));
+    } else {
+      args.successCallback(_createApplicationInformationArray(
+          native.getResultObject(result).informationArray)
+      );
+    }
   };
-  try {
-    var syncResult =
-        callNativeWithCallback('ApplicationManager_getAppsInfo', nativeParam, function(result) {
-      if (native_.isSuccess(result)) {
-        var returnArray = [];
-        for (var i = 0; i < result.informationArray.length; i++) {
-          var appInfo = getAppInfoWithReadOnly(result.informationArray[i]);
-          returnArray.push(appInfo);
-        }
-        args.successCallback(returnArray);
-      }
-      else if (native_.isFailure(result)) {
-        native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
-      }
-    });
-  } catch (e) {
-    throw e;
+
+  var result = native.call('ApplicationManager_getAppsInfo', {}, callback);
+
+  if (native.isFailure(result)) {
+    throw native.getErrorObject(result);
   }
 };
 
-ApplicationManager.prototype.getAppInfo = function(id) {
-  var args = validator_.validateArgs(arguments, [
-    {'name': 'id', 'type': types_.STRING, 'optional': true, 'nullable': true}
+ApplicationManager.prototype.getAppInfo = function() {
+  var args = AV.validateMethod(arguments, [
+      {
+        name : 'id',
+        type : AV.Types.STRING,
+        optional : true,
+        nullable : true
+      }
   ]);
 
-  var nativeParam = {
-  };
-  if (args['id']) {
-    nativeParam['id'] = args.id;
+  var callArgs = {};
+
+  if (args.has.id) {
+    callArgs.id = args.id;
   }
-  try {
-    var syncResult = callNative('ApplicationManager_getAppInfo', nativeParam);
-  } catch (e) {
-    throw e;
+
+  var result = native.callSync('ApplicationManager_getAppInfo', callArgs);
+
+  if (native.isFailure(result)) {
+    throw native.getErrorObject(result);
+  } else {
+    return new ApplicationInformation(native.getResultObject(result));
   }
-  var appInfo = getAppInfoWithReadOnly(syncResult);
-  return appInfo;
 };
 
-ApplicationManager.prototype.getAppCerts = function(id) {
-  var args = validator_.validateArgs(arguments, [
-    {'name': 'id', 'type': types_.STRING, 'optional': true, 'nullable': true}
+ApplicationManager.prototype.getAppCerts = function() {
+  var args = AV.validateMethod(arguments, [
+      {
+        name : 'id',
+        type : AV.Types.STRING,
+        optional : true,
+        nullable : true
+      }
   ]);
 
-  var nativeParam = {
-  };
-  if (args['id']) {
-    nativeParam['id'] = args.id;
-  }
-  try {
-    var syncResult = callNative('ApplicationManager_getAppCerts', nativeParam);
-  } catch (e) {
-    throw e;
+  var callArgs = {};
+
+  if (args.has.id) {
+    callArgs.id = args.id;
   }
 
-  var returnArrayObject = [];
+  var result = native.callSync('ApplicationManager_getAppCerts', callArgs);
 
-  for (var i = 0; i < syncResult.length; i++) {
-    var returnObject = new ApplicationCertificate();
-    setReadOnlyProperty(returnObject, 'type', syncResult[i].type); // read only property
-    setReadOnlyProperty(returnObject, 'value', syncResult[i].value); // read only property
-    returnArrayObject.push(returnObject);
+  if (native.isFailure(result)) {
+    throw native.getErrorObject(result);
+  } else {
+    var certificates = native.getResultObject(result);
+    var c = [];
+    certificates.forEach(function (i) {
+      c.push(new ApplicationCertificate(i));
+    });
+    return c;
   }
-  return returnArrayObject;
 };
 
 ApplicationManager.prototype.getAppSharedURI = function() {
-  var args = validator_.validateArgs(arguments, [
-    {'name': 'id', 'type': types_.STRING, optional: true, nullable: true}
+  var args = AV.validateMethod(arguments, [
+      {
+        name : 'id',
+        type : AV.Types.STRING,
+        optional : true,
+        nullable : true
+      }
   ]);
 
-  var nativeParam = {
-  };
-  if (args['id']) {
-    nativeParam['id'] = args.id;
-  }
-  try {
-    var syncResult = callNative('ApplicationManager_getAppSharedURI', nativeParam);
-  } catch (e) {
-    throw e;
+  var callArgs = {};
+
+  if (args.has.id) {
+    callArgs.id = args.id;
   }
 
-  return syncResult;
+  var result = native.callSync('ApplicationManager_getAppSharedURI', callArgs);
+
+  if (native.isFailure(result)) {
+    throw native.getErrorObject(result);
+  } else {
+    return native.getResultObject(result);
+  }
 };
 
-ApplicationManager.prototype.getAppMetaData = function(id) {
-  var args = validator_.validateArgs(arguments, [
-    {'name': 'id', 'type': types_.STRING, 'optional': true, 'nullable': true}
+ApplicationManager.prototype.getAppMetaData = function() {
+  var args = AV.validateMethod(arguments, [
+      {
+        name : 'id',
+        type : AV.Types.STRING,
+        optional : true,
+        nullable : true
+      }
   ]);
 
-  var nativeParam = {
-  };
-  if (args['id']) {
-    nativeParam['id'] = args.id;
+  var callArgs = {};
+
+  if (args.has.id) {
+    callArgs.id = args.id;
   }
-  try {
-    var syncResult = callNative('ApplicationManager_getAppMetaData', nativeParam);
-  } catch (e) {
-    throw e;
+
+  var result = native.callSync('ApplicationManager_getAppMetaData', callArgs);
+
+  if (native.isFailure(result)) {
+    throw native.getErrorObject(result);
+  } else {
+    var metaData = native.getResultObject(result);
+    var md = [];
+    metaData.forEach(function (i) {
+      md.push(new ApplicationMetaData(i));
+    });
+    return md;
   }
+};
+
+function ListenerManager(native, listenerName) {
+  this.listeners = {};
+  this.nextId = 1;
+  this.nativeSet = false;
+  this.native = native;
+  this.listenerName = listenerName;
+};
+
+ListenerManager.prototype.onListenerCalled = function(msg) {
+  var d = null;
 
-  var returnArrayObject = [];
+  switch (msg.action) {
+  case 'oninstalled':
+  case 'onupdated':
+    d = new ApplicationInformation(msg.data);
+    break;
 
-  for (var i = 0; i < syncResult.length; i++) {
-    var returnObject = new ApplicationMetaData();
-    setReadOnlyProperty(returnObject, 'key', syncResult[i].key); // read only property
-    setReadOnlyProperty(returnObject, 'value', syncResult[i].value); // read only property
-    returnArrayObject.push(returnObject);
+  case 'onuninstalled':
+    d = msg.data;
+    break;
+
+  default:
+    console.logd('Unknown mode: ' + msg.action);
+  return;
+  }
+
+  for (var watchId in this.listeners) {
+    if (this.listeners.hasOwnProperty(watchId) && this.listeners[watchId][msg.action]) {
+      this.listeners[watchId][msg.action](d);
+    }
   }
-  return returnArrayObject;
 };
 
-ApplicationManager.prototype.addAppInfoEventListener = function(eventCallback) {
-  var args = validator_.validateArgs(arguments, [
-    {'name': 'eventCallback', 'type': types_.LISTENER,
-      'values': ['oninstalled', 'onupdated', 'onuninstalled']}
-  ]);
+ListenerManager.prototype.addListener = function(callback) {
+  console.log('ListenerManager.prototype.addListener');
+  var id = this.nextId;
+  if (!this.nativeSet) {
+    this.native.addListener(this.listenerName, this.onListenerCalled.bind(this));
+    var result = this.native.callSync('ApplicationManager_addAppInfoEventListener');
+    if (this.native.isFailure(result)) {
+      throw this.native.getErrorObject(result);
+    }
+    this.nativeSet = true;
+  }
 
-  var param = {
-  };
-  try {
-    var syncResult =
-        callNativeWithCallback('ApplicationManager_addAppInfoEventListener', param, function(ret) {
-      if (ret.type === 'oninstalled') {
-        var appInfo = getAppInfoWithReadOnly(ret.info);
-        args.eventCallback.oninstalled(appInfo);
-      } else if (ret.type === 'onupdated') {
-        var appInfo = getAppInfoWithReadOnly(ret.info);
-        args.eventCallback.oninstalled(appInfo);
-      } else if (ret.type === 'onuninstalled') {
-        args.eventCallback.onuninstalled(ret.id);
-      }
-    });
-  } catch (e) {
-    throw e;
+  this.listeners[id] = callback;
+  ++this.nextId;
+
+  return id;
+};
+
+ListenerManager.prototype.removeListener = function(watchId) {
+  if (this.listeners.hasOwnProperty(watchId)) {
+    delete this.listeners[watchId];
   }
 
-  return syncResult;
+  if (this.nativeSet && T.isEmptyObject(this.listeners)) {
+      this.native.callSync('ApplicationManager_removeAppInfoEventListener');
+      this.native.removeListener(this.listenerName);
+      this.nativeSet = false;
+  }
 };
 
-ApplicationManager.prototype.removeAppInfoEventListener = function(watchId) {
-  var args = validator_.validateArgs(arguments, [
-    {'name': 'watchId', 'type': types_.LONG}
+var APPLICATION_EVENT_LISTENER = 'ApplicationEventListener';
+var applicationEventListener = new ListenerManager(native, APPLICATION_EVENT_LISTENER);
+
+ApplicationManager.prototype.addAppInfoEventListener = function() {
+  var args = AV.validateMethod(arguments, [
+      {
+        name : 'eventCallback',
+        type : AV.Types.LISTENER,
+        values : ['oninstalled', 'onupdated', 'onuninstalled']
+      }
   ]);
 
-  var nativeParam = {
-    'watchId': args.watchId
-  };
-  try {
-    var syncResult = callNative('ApplicationManager_removeAppInfoEventListener', nativeParam);
-  } catch (e) {
-    throw e;
-  }
+  return applicationEventListener.addListener(args.eventCallback);
+};
+
+ApplicationManager.prototype.removeAppInfoEventListener = function() {
+  var args = AV.validateMethod(arguments, [
+      {
+        name : 'watchId',
+        type : AV.Types.LONG
+      }
+  ]);
+
+  applicationEventListener.removeListener(args.watchId);
 };
 
-function Application() {
-  // constructor of Application
+// class Application ////////////////////////////////////////////////////
+
+function Application(data) {
+  Object.defineProperties(this, {
+    appInfo : {
+      value : new ApplicationInformation(data.appInfo),
+      writable : false,
+      enumerable : true
+    },
+    contextId : {
+      value : Converter.toString(data.contextId),
+      writable : false,
+      enumerable : true
+    }
+  });
 }
 
 Application.prototype.exit = function() {
-  return native_.sendRuntimeMessage('Application_exit');
+  native.sendRuntimeMessage('tizen://exit');
 };
 
 Application.prototype.hide = function() {
-  return native_.sendRuntimeMessage('Application_hide');
+  native.sendRuntimeMessage('tizen://hide');
 };
 
 Application.prototype.getRequestedAppControl = function() {
-  var nativeParam = {
-  };
-  try {
-    var syncResult = callNative('Application_getRequestedAppControl', nativeParam);
-  } catch (e) {
-    throw e;
+  var result = native.callSync('Application_getRequestedAppControl', {});
+
+  if (native.isFailure(result)) {
+    throw native.getErrorObject(result);
+  } else {
+    result = native.getResultObject(result);
+    if (result) {
+      return new RequestedApplicationControl(result);
+    } else {
+      return null;
+    }
   }
+};
 
-  var returnObject = new RequestedApplicationControl();
-  setReadOnlyProperty(returnObject, 'appControl', syncResult.appControl); // read only property
-  setReadOnlyProperty(returnObject, 'callerAppId', syncResult.callerAppId); // read only property
+// class ApplicationInformation ////////////////////////////////////////////////////
 
-  return returnObject;
-};
+function ApplicationInformation(data) {
+  var size;
+  var sizeException;
 
-function ApplicationInformation() {
-  // constructor of ApplicationInformation
+  function sizeGetter() {
+    if (undefined === size) {
+      var callArgs = { packageId : this.packageId }; // jshint ignore:line
+      var result = native.callSync('ApplicationInformation_getSize', callArgs);
+
+      if (native.isFailure(result)) {
+        sizeException = native.getErrorObject(result);
+        size = 0;
+      } else {
+        size = native.getResultObject(result).size;
+      }
+    }
+
+    if (undefined !== sizeException) {
+      throw sizeException;
+    }
+
+    return size;
+  }
+
+  Object.defineProperties(this, {
+    id : {
+      value : data.id,
+      writable : false,
+      enumerable : true
+    },
+    name : {
+      value : data.name,
+      writable : false,
+      enumerable : true
+    },
+    iconPath : {
+      value : data.iconPath,
+      writable : false,
+      enumerable : true
+    },
+    version : {
+      value : data.version,
+      writable : false,
+      enumerable : true
+    },
+    show : {
+      value : data.show,
+      writable : false,
+      enumerable : true
+    },
+    categories : {
+      value : data.categories,
+      writable : false,
+      enumerable : true
+    },
+    installDate : {
+      value : new Date(data.installDate),
+      writable : false,
+      enumerable : true
+    },
+    size : {
+      enumerable : true,
+      set : function() {
+      },
+      get : sizeGetter
+    },
+    packageId : {
+      value : data.packageId,
+      writable : false,
+      enumerable : true
+    }
+  });
 }
 
-function ApplicationContext() {
-  // constructor of ApplicationContext
+// class ApplicationContext ////////////////////////////////////////////////////
+
+function ApplicationContext(data) {
+  Object.defineProperties(this, {
+    id    : {value: data.id, writable: false, enumerable: true},
+    appId : {value: data.appId, writable: false, enumerable: true}
+  });
 }
 
-tizen.ApplicationControlData = function(key, value) {
-  if (this && this.constructor === tizen.ApplicationControlData &&
-      (typeof(key) === 'string' || key instanceof String) &&
-      (value && value instanceof Array)) {
-    defineReadWriteNonNullProperty(this, 'key', key);
-    defineReadWriteNonNullProperty(this, 'value', value);
-  } else {
-    throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
+// class ApplicationControlData ////////////////////////////////////////////////////
+
+tizen.ApplicationControlData = function(k, v) {
+  AV.validateConstructorCall(this, tizen.ApplicationControlData);
+
+  var valid = (arguments.length >= 2) && T.isArray(v);
+
+  var key;
+  function keySetter(k) {
+    key = Converter.toString(k);
+  }
+  if (valid) {
+    keySetter(k);
   }
-};
 
-tizen.ApplicationControl = function(operation, uri, mime, category, data, launchMode) {
-  if (this && this.constructor === tizen.ApplicationControl &&
-      (typeof(operation) === 'string' || operation instanceof String)) {
+  var value;
+  function valueSetter(v) {
+    if (T.isArray(v)) {
+      value = [];
+      for (var i = 0; i < v.length; ++i) {
+        value.push(Converter.toString(v[i]));
+      }
+    }
+  }
+  if (valid) {
+    valueSetter(v);
+  }
 
-    defineReadWriteNonNullProperty(this, 'operation', operation);
-    defineReadWriteProperty(this, 'uri', uri);
-    defineReadWriteProperty(this, 'mime', mime);
-    defineReadWriteProperty(this, 'category', category);
-    defineReadWriteProperty(this, 'data', data);
-    defineReadWriteProperty(this, 'launchMode', launchMode);
+  Object.defineProperties(this, {
+    key : {
+      enumerable : true,
+      set : keySetter,
+      get : function() {
+        return key;
+      }
+    },
+    value : {
+      enumerable : true,
+      set : valueSetter,
+      get : function() {
+        return value;
+      }
+    }
+  });
+}
 
-  } else {
-    throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR);
+// class ApplicationControl ////////////////////////////////////////////////////
+
+tizen.ApplicationControl = function(o, u, m, c, d, mode) {
+  AV.validateConstructorCall(this, tizen.ApplicationControl);
+
+  var valid = (arguments.length >= 1);
+
+  var operation;
+  function operationSetter(o) {
+    operation = Converter.toString(o);
   }
-};
+  if (valid) {
+    operationSetter(o);
+  }
+
+  var uri;
+  function uriSetter(u) {
+    if (T.isNull(u)) {
+      uri = u;
+    } else {
+      uri = Converter.toString(u);
+    }
+  }
+  if (valid) {
+    uriSetter(T.isUndefined(u) ? null : u);
+  }
+
+  var mime;
+  function mimeSetter(m) {
+    if (T.isNull(m)) {
+      mime = m;
+    } else {
+      mime = Converter.toString(m);
+    }
+  }
+  if (valid) {
+    mimeSetter(T.isUndefined(m) ? null : m);
+  }
+
+  var category;
+  function categorySetter(c) {
+    if (T.isNull(c)) {
+      category = c;
+    } else {
+      category = Converter.toString(c);
+    }
+  }
+  if (valid) {
+    categorySetter(T.isUndefined(c) ? null : c);
+  }
+
+  var data;
+  function dataSetter(d) {
+    if (T.isArray(d)) {
+      for (var i = 0; i < d.length; ++i) {
+        if (!(d[i] instanceof tizen.ApplicationControlData)) {
+          return;
+        }
+      }
+      data = d;
+    }
+  }
+  if (valid) {
+    dataSetter(T.isNullOrUndefined(d) ? [] : d);
+  }
+
+  var launchMode;
+  function launchModeSetter(mode) {
+    if (ApplicationControlLaunchMode[mode]) {
+       launchMode = ApplicationControlLaunchMode[mode];
+    }
+  }
+  if (valid) {
+    if (T.isNullOrUndefined(mode) || !ApplicationControlLaunchMode[mode]) {
+      launchMode = ApplicationControlLaunchMode['SINGLE'];
+    } else {
+      launchModeSetter(mode);
+    }
+  }
+
+  Object.defineProperties(this, {
+    operation : {
+      enumerable : true,
+      set : operationSetter,
+      get : function() {
+        return operation;
+      }
+    },
+    uri : {
+      enumerable : true,
+      set : uriSetter,
+      get : function() {
+        return uri;
+      }
+    },
+    mime : {
+      enumerable : true,
+      set : mimeSetter,
+      get : function() {
+        return mime;
+      }
+    },
+    category : {
+      enumerable : true,
+      set : categorySetter,
+      get : function() {
+        return category;
+      }
+    },
+    data : {
+      enumerable : true,
+      set : dataSetter,
+      get : function() {
+        return data;
+      }
+    },
+    launchMode : {
+      enumerable : true,
+      set : launchModeSetter,
+      get : function() {
+        return launchMode;
+      }
+    }
+  });
+}
+
+// class RequestedApplicationControl ////////////////////////////////////////////////////
 
-function RequestedApplicationControl() {
-  // constructor of RequestedApplicationControl
+function RequestedApplicationControl(data) {
+  Object.defineProperties(this, {
+    appControl : {
+      value: _createApplicationControl(data.appControl),
+      writable: false,
+      enumerable: true
+    },
+    callerAppId : {
+      value: data.callerAppId,
+      writable: false,
+      enumerable: true
+    }
+  });
 }
 
-RequestedApplicationControl.prototype.replyResult = function(data) {
-  var args = validator_.validateArgs(arguments, [
-    {'name': 'data', 'type': types_.PLATFORM_OBJECT,
-      'values': tizen.ApplicationControlData, 'optional': true}
+RequestedApplicationControl.prototype.replyResult = function() {
+  var args = AV.validateMethod(arguments, [
+      {
+        name : 'data',
+        type : AV.Types.ARRAY,
+        values : tizen.ApplicationControlData,
+        optional: true,
+        nullable: true
+      }
   ]);
 
-  var nativeParam = {
-  };
-  if (args['data']) {
-    nativeParam['data'] = args.data;
+
+  var callArgs = {};
+
+  if (args.has.data) {
+    callArgs.data = args.data;
+  } else {
+    callArgs.data = [];
   }
-  if (this.callerAppId)
-    nativeParam['callerAppId'] = this.callerAppId;
-  try {
-    var syncResult = callNative('RequestedApplicationControl_replyResult', nativeParam);
-  } catch (e) {
-    throw e;
+
+  var result = native.callSync('RequestedApplicationControl_replyResult', callArgs);
+
+  if (native.isFailure(result)) {
+    throw native.getErrorObject(result);
   }
 };
 
 RequestedApplicationControl.prototype.replyFailure = function() {
-  var nativeParam = {
-  };
-  if (this.callerAppId)
-    nativeParam['callerAppId'] = this.callerAppId;
-  try {
-    var syncResult = callNative('RequestedApplicationControl_replyFailure', nativeParam);
-  } catch (e) {
-    throw e;
+  var result = native.callSync('RequestedApplicationControl_replyFailure', {});
+
+  if (native.isFailure(result)) {
+    throw native.getErrorObject(result);
   }
 };
 
-function ApplicationCertificate() {
-  // constructor of ApplicationCertificate
+// class ApplicationCertificate ////////////////////////////////////////////////////
+
+function ApplicationCertificate(data) {
+  Object.defineProperties(this, {
+    type : {
+      value : data.type,
+      writable : false,
+      enumerable : true
+    },
+    value : {
+      value : data.value,
+      writable : false,
+      enumerable : true
+    }
+  });
 }
 
-function ApplicationMetaData() {
-  // constructor of ApplicationMetaData
+// class ApplicationMetaData ////////////////////////////////////////////////////
+function ApplicationMetaData(data) {
+  Object.defineProperties(this, {
+    key : {
+      value : data.key,
+      writable : false,
+      enumerable : true
+    },
+    value : {
+      value : data.value,
+      writable : false,
+      enumerable : true
+    }
+  });
 }
 
+// exports ////////////////////////////////////////////////////
 exports = new ApplicationManager();
diff --git a/src/application/application_certificate.cc b/src/application/application_certificate.cc
deleted file mode 100644 (file)
index c59889f..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2014 Samsung Electronics Co, Ltd. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "application/application_certificate.h"
-
-#include <app_manager.h>
-
-#include "common/logger.h"
-#include "tizen/tizen.h"
-
-namespace extension {
-namespace application {
-
-ApplicationCertificate::ApplicationCertificate() {
-}
-
-ApplicationCertificate::~ApplicationCertificate() {
-}
-
-const picojson::value& ApplicationCertificate::Value() {
-  if (value_.is<picojson::null>() && IsValid()) {
-    picojson::object obj;
-    obj["type"] = picojson::value(cert_type_);
-    obj["value"] = picojson::value(cert_value_);
-    value_ = picojson::value(obj);
-  }
-  return value_;
-}
-
-bool ApplicationCertificate::IsValid() const {
-  return error_.empty();
-}
-
-std::string ApplicationCertificate::get_cert_type() const {
-  return cert_type_;
-}
-
-void ApplicationCertificate::set_cert_type(const std::string& cert_type) {
-  cert_type_ = cert_type;
-}
-
-std::string ApplicationCertificate::get_cert_value() const {
-  return cert_value_;
-}
-
-void ApplicationCertificate::set_cert_value(const std::string& cert_value) {
-  cert_value_ = cert_value;
-}
-
-}  // namespace application
-}  // namespace extension
diff --git a/src/application/application_certificate.h b/src/application/application_certificate.h
deleted file mode 100644 (file)
index 21a9ef0..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2014 Samsung Electronics Co, Ltd. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SRC_APPLICATION_APPLICATION_CERTIFICATE_H_
-#define SRC_APPLICATION_APPLICATION_CERTIFICATE_H_
-
-#include <string>
-#include <memory>
-#include <vector>
-
-#include "common/picojson.h"
-#include "tizen/tizen.h"
-
-namespace extension {
-namespace application {
-
-class ApplicationCertificate;
-typedef std::shared_ptr<ApplicationCertificate> ApplicationCertificatePtr;
-
-typedef std::vector<ApplicationCertificatePtr> ApplicationCertificateArray;
-typedef std::shared_ptr<ApplicationCertificateArray>
-  ApplicationCertificateArrayPtr;
-
-class ApplicationCertificate {
- public:
-  ApplicationCertificate();
-  ~ApplicationCertificate();
-
-  const picojson::value& Value();
-  bool IsValid() const;
-
-  std::string get_cert_type() const;
-  void set_cert_type(const std::string& cert_type);
-
-  std::string get_cert_value() const;
-  void set_cert_value(const std::string& cert_value);
-
- private:
-  std::string cert_type_;
-  std::string cert_value_;
-
-  picojson::object data_;
-  picojson::object error_;
-  picojson::value value_;
-};
-
-}  // namespace application
-}  // namespace extension
-
-#endif  // SRC_APPLICATION_APPLICATION_CERTIFICATE_H_
diff --git a/src/application/application_context.cc b/src/application/application_context.cc
deleted file mode 100644 (file)
index c825440..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2014 Samsung Electronics Co, Ltd. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "application/application_context.h"
-
-#include <app_manager.h>
-
-#include "common/logger.h"
-#include "tizen/tizen.h"
-
-namespace extension {
-namespace application {
-
-ApplicationContext::ApplicationContext() {
-}
-
-ApplicationContext::ApplicationContext(const std::string& context_id)
-  : context_id_(context_id) {
-}
-
-ApplicationContext::~ApplicationContext() {
-}
-
-const picojson::value& ApplicationContext::Value() {
-  if (value_.is<picojson::null>() && IsValid()) {
-    picojson::object obj;
-    obj["id"] = picojson::value(context_id_);
-    obj["appId"] = picojson::value(app_id_);
-    value_ = picojson::value(obj);
-  }
-  return value_;
-}
-
-bool ApplicationContext::IsValid() const {
-  return error_.empty();
-}
-
-std::string ApplicationContext::get_context_id() {
-  return context_id_;
-}
-
-void ApplicationContext::set_context_id(const std::string& context_id) {
-  context_id_ = context_id;
-}
-
-std::string ApplicationContext::get_app_id() {
-  return app_id_;
-}
-
-void ApplicationContext::set_app_id(const std::string& app_id) {
-  app_id_ = app_id;
-}
-
-}  // namespace application
-}  // namespace extension
diff --git a/src/application/application_context.h b/src/application/application_context.h
deleted file mode 100644 (file)
index 6aeaf67..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2014 Samsung Electronics Co, Ltd. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SRC_APPLICATION_APPLICATION_CONTEXT_H_
-#define SRC_APPLICATION_APPLICATION_CONTEXT_H_
-
-#include <string>
-#include <memory>
-#include <vector>
-
-#include "common/picojson.h"
-#include "tizen/tizen.h"
-
-namespace extension {
-namespace application {
-
-class ApplicationContext;
-typedef std::shared_ptr<ApplicationContext> ApplicationContextPtr;
-
-typedef std::vector<ApplicationContextPtr> ApplicationContextArray;
-typedef std::shared_ptr<ApplicationContextArray> ApplicationContextArrayPtr;
-
-
-class ApplicationContext {
- public:
-  ApplicationContext();
-  explicit ApplicationContext(const std::string& context_id);
-  ~ApplicationContext();
-
-  const picojson::value& Value();
-  bool IsValid() const;
-
-  std::string get_context_id();
-  void set_context_id(const std::string& context_id);
-
-  std::string get_app_id();
-  void set_app_id(const std::string& app_id);
-
- private:
-  std::string context_id_;
-  std::string app_id_;
-
-  picojson::object data_;
-  picojson::object error_;
-  picojson::value value_;
-};
-
-}  // namespace application
-}  // namespace extension
-
-#endif  // SRC_APPLICATION_APPLICATION_CONTEXT_H_
diff --git a/src/application/application_control.cc b/src/application/application_control.cc
deleted file mode 100644 (file)
index d57d3fa..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2014 Samsung Electronics Co, Ltd. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "application/application_control.h"
-
-#include <app_manager.h>
-
-#include "common/logger.h"
-#include "tizen/tizen.h"
-
-namespace extension {
-namespace application {
-
-ApplicationControl::ApplicationControl() {
-}
-
-ApplicationControl::~ApplicationControl() {
-}
-
-const picojson::value& ApplicationControl::Value() {
-  if (value_.is<picojson::null>() && IsValid()) {
-    data_["operation"] = picojson::value(operation_);
-    data_["uri"] = picojson::value(uri_);
-    data_["mime"] = picojson::value(mime_);
-    data_["category"] = picojson::value(category_);
-
-    picojson::value datas = picojson::value(picojson::array());
-    picojson::array& datas_array = datas.get<picojson::array>();
-    for (auto it = data_array_.begin(); it != data_array_.end(); it++) {
-      datas_array.push_back((*it)->Value());
-    }
-    data_["data"] = datas;
-
-    value_ = picojson::value(data_);
-  }
-  return value_;
-}
-
-bool ApplicationControl::IsValid() const {
-  return error_.empty();
-}
-
-std::string ApplicationControl::get_operation() const {
-  return operation_;
-}
-
-void ApplicationControl::set_operation(const std::string& operation) {
-  operation_ = operation;
-}
-
-std::string ApplicationControl::get_uri() const {
-  return uri_;
-}
-
-void ApplicationControl::set_uri(const std::string& uri) {
-  uri_ = uri;
-}
-
-std::string ApplicationControl::get_mime() const {
-  return mime_;
-}
-
-void ApplicationControl::set_mime(const std::string& mime) {
-  mime_ = mime;
-}
-
-std::string ApplicationControl::get_category() const {
-  return category_;
-}
-
-void ApplicationControl::set_category(const std::string& category) {
-  category_ = category;
-}
-
-ApplicationControlDataArray ApplicationControl::get_data_array() const {
-  return data_array_;
-}
-
-void ApplicationControl::set_data_array
-  (const ApplicationControlDataArray& data_array) {
-  data_array_ = data_array;
-}
-
-void ApplicationControl::add_data_array
-  (const ApplicationControlDataPtr& data_ptr) {
-  data_array_.push_back(data_ptr);
-}
-
-}  // namespace application
-}  // namespace extension
diff --git a/src/application/application_control.h b/src/application/application_control.h
deleted file mode 100644 (file)
index 9d96be2..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2014 Samsung Electronics Co, Ltd. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SRC_APPLICATION_APPLICATION_CONTROL_H_
-#define SRC_APPLICATION_APPLICATION_CONTROL_H_
-
-#include <string>
-#include <memory>
-
-#include "common/picojson.h"
-#include "tizen/tizen.h"
-
-#include "application/application_controldata.h"
-
-namespace extension {
-namespace application {
-
-class ApplicationControl;
-typedef std::shared_ptr<ApplicationControl> ApplicationControlPtr;
-
-class ApplicationControl {
- public:
-  ApplicationControl();
-  ~ApplicationControl();
-
-  const picojson::value& Value();
-  bool IsValid() const;
-
-  std::string get_operation() const;
-  void set_operation(const std::string& operation);
-  std::string get_uri() const;
-  void set_uri(const std::string& uri);
-  std::string get_mime() const;
-  void set_mime(const std::string& mime);
-  std::string get_category() const;
-  void set_category(const std::string& category);
-  ApplicationControlDataArray get_data_array() const;
-  void set_data_array(const ApplicationControlDataArray& data_array);
-  void add_data_array(const ApplicationControlDataPtr& data_ptr);
-
- private:
-  std::string operation_;
-  std::string uri_;
-  std::string mime_;
-  std::string category_;
-  ApplicationControlDataArray data_array_;
-
-  picojson::object data_;
-  picojson::object error_;
-  picojson::value value_;
-};
-
-}  // namespace application
-}  // namespace extension
-
-#endif  // SRC_APPLICATION_APPLICATION_CONTROL_H_
diff --git a/src/application/application_controldata.cc b/src/application/application_controldata.cc
deleted file mode 100644 (file)
index 558a414..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2014 Samsung Electronics Co, Ltd. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "application/application_controldata.h"
-
-#include <app_manager.h>
-
-#include "common/logger.h"
-#include "tizen/tizen.h"
-
-namespace extension {
-namespace application {
-
-ApplicationControlData::ApplicationControlData() {
-}
-
-ApplicationControlData::~ApplicationControlData() {
-}
-
-const picojson::value& ApplicationControlData::Value() {
-  if (value_.is<picojson::null>() && IsValid()) {
-    data_["key"] = picojson::value(ctr_key_);
-    picojson::value values = picojson::value(picojson::array());
-    picojson::array& values_array = values.get<picojson::array>();
-    for (auto it = ctr_value_.begin(); it != ctr_value_.end(); it++) {
-      values_array.push_back(picojson::value(*it));
-    }
-    data_["value"] = values;
-
-    value_ = picojson::value(data_);
-  }
-  return value_;
-}
-
-bool ApplicationControlData::IsValid() const {
-  return error_.empty();
-}
-
-std::string ApplicationControlData::get_ctr_key() const {
-  return ctr_key_;
-}
-
-void ApplicationControlData::set_ctr_key(const std::string& ctr_key) {
-  ctr_key_ = ctr_key;
-}
-
-std::vector<std::string> ApplicationControlData::get_ctr_value() const {
-  return ctr_value_;
-}
-
-void ApplicationControlData::set_ctr_value
-  (const std::vector<std::string> &ctr_values) {
-  ctr_value_ = ctr_values;
-}
-
-void ApplicationControlData::add_ctr_value(const std::string& ctr_value) {
-  ctr_value_.push_back(ctr_value);
-}
-
-
-
-}  // namespace application
-}  // namespace extension
diff --git a/src/application/application_controldata.h b/src/application/application_controldata.h
deleted file mode 100644 (file)
index a9371dd..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2014 Samsung Electronics Co, Ltd. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SRC_APPLICATION_APPLICATION_CONTROLDATA_H_
-#define SRC_APPLICATION_APPLICATION_CONTROLDATA_H_
-
-#include <string>
-#include <memory>
-#include <vector>
-
-#include "common/picojson.h"
-#include "tizen/tizen.h"
-
-namespace extension {
-namespace application {
-
-class ApplicationControlData;
-typedef std::shared_ptr<ApplicationControlData> ApplicationControlDataPtr;
-
-typedef std::vector<ApplicationControlDataPtr> ApplicationControlDataArray;
-typedef std::shared_ptr<ApplicationControlDataArray>
-  ApplicationControlDataArrayPtr;
-
-class ApplicationControlData {
- public:
-  ApplicationControlData();
-  ~ApplicationControlData();
-
-  const picojson::value& Value();
-  bool IsValid() const;
-
-  std::string get_ctr_key() const;
-  void set_ctr_key(const std::string& ctr_key);
-
-  std::vector<std::string> get_ctr_value() const;
-  void set_ctr_value(const std::vector<std::string>& ctr_values);
-  void add_ctr_value(const std::string& ctr_value);
-
- private:
-  std::string ctr_key_;
-  std::vector<std::string> ctr_value_;
-
-  picojson::object data_;
-  picojson::object error_;
-  picojson::value value_;
-};
-
-}  // namespace application
-}  // namespace extension
-
-#endif  // SRC_APPLICATION_APPLICATION_CONTROLDATA_H_
index 1156ed338992b9fabd5e6d86592e8179e599c575..89cbd02060c19b9174aa27cb1f1531e1dc5c5161 100644 (file)
 #include "application/application_instance.h"
 #include "common/logger.h"
 
+namespace {
+const char* kApplication = "tizen.application";
+const char* kApplicationControl = "tizen.ApplicationControl";
+const char* kApplicationControlData = "tizen.ApplicationControlData";
+}
+
 // This will be generated from application_api.js
 extern const char kSource_application_api[];
 
@@ -30,11 +36,14 @@ ApplicationExtension::ApplicationExtension() {
 
   LoggerD("app_id: %s", app_id_.c_str());
 
-  SetExtensionName("tizen.application");
+  SetExtensionName(kApplication);
   SetJavaScriptAPI(kSource_application_api);
 
   const char* entry_points[] = {
-      "tizen.ApplicationControlData", "tizen.ApplicationControl", NULL};
+      kApplicationControl,
+      kApplicationControlData,
+      NULL
+  };
   SetExtraJSEntryPoints(entry_points);
 }
 
diff --git a/src/application/application_information.cc b/src/application/application_information.cc
deleted file mode 100644 (file)
index 57d4d41..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright 2014 Samsung Electronics Co, Ltd. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "application/application_information.h"
-
-#include <sstream>
-#include <vector>
-
-#include "common/logger.h"
-#include "tizen/tizen.h"
-
-namespace extension {
-namespace application {
-
-ApplicationInformation::ApplicationInformation() {
-}
-
-ApplicationInformation::~ApplicationInformation() {
-}
-
-std::string ApplicationInformation::get_app_id() const {
-  return app_id_;
-}
-
-void ApplicationInformation::set_app_id(const std::string &app_id) {
-  app_id_ = app_id;
-}
-
-std::string ApplicationInformation::get_name() const {
-  return name_;
-}
-
-void ApplicationInformation::set_name(const std::string &name) {
-  name_ = name;
-}
-
-std::string ApplicationInformation::get_icon_path() const {
-  return icon_path_;
-}
-
-void ApplicationInformation::set_icon_path(const std::string &icon_path) {
-  icon_path_ = icon_path;
-}
-
-bool ApplicationInformation::get_show() const {
-  return show_;
-}
-
-void ApplicationInformation::set_show(const bool show) {
-  show_ = show;
-}
-
-std::string ApplicationInformation::get_package_id() const {
-  return package_id_;
-}
-
-void ApplicationInformation::set_package_id(const std::string &package_id) {
-  package_id_ = package_id;
-}
-
-std::string ApplicationInformation::get_version() const {
-  return version_;
-}
-
-void ApplicationInformation::set_version(const std::string &version) {
-  version_ = version;
-}
-
-double ApplicationInformation::get_install_date() const {
-  return install_date_;
-}
-
-void ApplicationInformation::set_install_date(const time_t &install_date) {
-  install_date_ = static_cast<double>(install_date);
-
-  // pkgmgrinfo_pkginfo_get_installed_time() returns installed time
-  // by using int type. but, it can't have millisecond value fully
-  install_date_ = install_date_ * 1000;
-}
-
-std::vector<std::string> ApplicationInformation::get_categories() const {
-  return categories_;
-}
-
-void ApplicationInformation::set_categories
-  (const std::vector<std::string> &categories) {
-  categories_ = categories;
-}
-
-void ApplicationInformation::add_categories(const std::string &category) {
-  categories_.push_back(category);
-}
-
-void ApplicationInformation::set_size(const int &size) {
-  size_ = static_cast<double>(size);
-}
-
-double ApplicationInformation::get_size() const {
-  return size_;
-}
-
-const picojson::value& ApplicationInformation::Value() {
-  if (value_.is<picojson::null>() && IsValid()) {
-    data_["id"] = picojson::value(app_id_);
-    data_["name"] = picojson::value(name_);
-    data_["iconPath"] = picojson::value(icon_path_);
-    data_["show"] = picojson::value(show_);
-    data_["packageId"] = picojson::value(package_id_);
-    data_["version"] = picojson::value(version_);
-    data_["installDate"] = picojson::value(install_date_);
-    picojson::value categories = picojson::value(picojson::array());
-    picojson::array& categories_array = categories.get<picojson::array>();
-    for (auto it = categories_.begin(); it != categories_.end(); it++) {
-      categories_array.push_back(picojson::value(*it));
-    }
-    data_["categories"] = categories;
-    // LoggerD("size: %f", size_);
-    data_["size"] = picojson::value(size_);
-
-    value_ = picojson::value(data_);
-  }
-  return value_;
-}
-
-bool ApplicationInformation::IsValid() const {
-  return error_.empty();
-}
-
-}  // namespace application
-}  // namespace extension
diff --git a/src/application/application_information.h b/src/application/application_information.h
deleted file mode 100644 (file)
index baa44d4..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2014 Samsung Electronics Co, Ltd. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SRC_APPLICATION_APPLICATION_INFORMATION_H_
-#define SRC_APPLICATION_APPLICATION_INFORMATION_H_
-
-#include <string>
-#include <memory>
-#include <vector>
-
-#include "common/picojson.h"
-
-namespace extension {
-namespace application {
-
-class ApplicationInformation;
-typedef std::shared_ptr<ApplicationInformation> ApplicationInformationPtr;
-
-typedef std::vector<ApplicationInformationPtr> ApplicationInformationArray;
-typedef std::shared_ptr<ApplicationInformationArray>
-  ApplicationInformationArrayPtr;
-
-class ApplicationInformation {
- public:
-  ApplicationInformation();
-  ~ApplicationInformation();
-
-  const picojson::value& Value();
-  bool IsValid() const;
-
-  std::string get_app_id() const;
-  void set_app_id(const std::string &app_id);
-  std::string get_name() const;
-  void set_name(const std::string &name);
-  std::string get_icon_path() const;
-  void set_icon_path(const std::string &icon_path);
-  bool get_show() const;
-  void set_show(const bool show);
-  void set_package_id(const std::string &package_id);
-  std::string get_package_id() const;
-  void set_version(const std::string &version);
-  std::string get_version() const;
-  void set_install_date(const time_t& install_date);
-  double get_install_date() const;
-  std::vector<std::string> get_categories() const;
-  void set_categories(const std::vector<std::string> &categories);
-  void add_categories(const std::string &category);
-  void set_size(const int& size);
-  double get_size() const;
-
- private:
-  std::string app_id_;
-  std::string name_;
-  std::string icon_path_;
-  bool show_;
-  std::string package_id_;
-  std::string version_;
-  double install_date_;
-  std::vector<std::string> categories_;
-  double size_;
-
-  picojson::object data_;
-  picojson::object error_;
-  picojson::value value_;
-};
-
-}  // namespace application
-}  // namespace extension
-
-#endif  // SRC_APPLICATION_APPLICATION_INFORMATION_H_
index f4744bb1c9fa06f7397874884e1c0d4accbf7b94..ec51c46276f1e07a35702e6139bfd58a22e12b50 100644 (file)
@@ -4,38 +4,11 @@
 
 #include "application/application_instance.h"
 
-// To get pid
-#include <unistd.h>
-#include <pthread.h>
-#include <glib.h>
-
-// to launch app by aul
-#include <aul.h>
-
-// to get package name by appid
-#include <app_info.h>
-#include <app_control_internal.h>
-
-// To get app size and installed time
-#include <pkgmgr-info.h>
-
-//#include <plugins-ipc-message/ipc_message_support.h>
-
-#include <algorithm>
-#include <cstring>
-#include <functional>
-#include <sstream>
-#include <utility>
-
 #include "common/logger.h"
 #include "common/picojson.h"
 #include "common/platform_exception.h"
 #include "common/task-queue.h"
 
-#include "application/application.h"
-#include "application/application_context.h"
-#include "application/application_control.h"
-
 namespace extension {
 namespace application {
 
@@ -47,2236 +20,199 @@ const std::string kPrivilegeApplicationInfo = "http://tizen.org/privilege/applic
 const std::string kPrivilegeApplicationLaunch = "http://tizen.org/privilege/application.launch";
 }  // namespace
 
-using common::PlatformException;
-using common::UnknownException;
-using common::TypeMismatchException;
-using common::IOException;
-using common::ServiceNotAvailableException;
-using common::SecurityException;
-using common::NetworkException;
-using common::NotSupportedException;
-using common::NotFoundException;
-using common::InvalidAccessException;
-using common::AbortException;
-using common::QuotaExceededException;
-using common::InvalidStateException;
-using common::InvalidModificationException;
-using common::InvalidValuesException;
-using common::TaskQueue;
-
-static ApplicationInformationPtr get_app_info(pkgmgrinfo_appinfo_h handle);
+using namespace common;
 
-ApplicationInstance::ApplicationInstance(const std::string& app_id) {
-  manager_handle_ = NULL;
-  watch_id_ = 0;
-  app_id_ = app_id;
+ApplicationInstance::ApplicationInstance(const std::string& app_id) :
+  manager_(*this),
+  app_id_(app_id) {
+  LoggerD("Entered");
 
   using std::placeholders::_1;
   using std::placeholders::_2;
-  #define REGISTER_SYNC(c, x) \
-    RegisterSyncHandler(c, std::bind(&ApplicationInstance::x, this, _1, _2));
-  REGISTER_SYNC("ApplicationManager_getAppCerts",
-    AppMgrGetAppCerts);
-  REGISTER_SYNC("Application_getRequestedAppControl",
-    AppGetRequestedAppControl);
-  REGISTER_SYNC("ApplicationManager_addAppInfoEventListener",
-    AppMgrAddAppInfoEventListener);
-  REGISTER_SYNC("ApplicationManager_getAppMetaData",
-    AppMgrGetAppMetaData);
-  REGISTER_SYNC("ApplicationManager_launchAppControl",
-    AppMgrLaunchAppControl);
-  REGISTER_SYNC("ApplicationManager_removeAppInfoEventListener",
-    AppMgrRemoveAppInfoEventListener);
-  REGISTER_SYNC("ApplicationManager_getAppInfo",
-    AppMgrGetAppInfo);
-  REGISTER_SYNC("ApplicationManager_getAppSharedURI",
-    AppMgrGetAppSharedURI);
-  REGISTER_SYNC("RequestedApplicationControl_replyResult",
-    RequestedAppControlReplyResult);
-  REGISTER_SYNC("ApplicationManager_kill",
-    AppMgrKill);
-  REGISTER_SYNC("ApplicationManager_getAppsInfo",
-    AppMgrGetAppsInfo);
-  REGISTER_SYNC("ApplicationManager_launch",
-    AppMgrLaunch);
-  REGISTER_SYNC("ApplicationManager_getAppsContext",
-    AppMgrGetAppsContext);
-  REGISTER_SYNC("ApplicationManager_getAppContext",
-    AppMgrGetAppContext);
-  REGISTER_SYNC("RequestedApplicationControl_replyFailure",
-    RequestedAppControlReplyFailure);
-  REGISTER_SYNC("ApplicationManager_getCurrentApplication",
-    AppMgrGetCurrentApplication);
-  REGISTER_SYNC("ApplicationManager_findAppControl",
-    AppMgrFindAppControl);
-  #undef REGISTER_SYNC
-}
-
-ApplicationInstance::~ApplicationInstance() {
-}
-
-
-enum ApplicationErrors {
-  APP_ERROR_OK = 0,
-  APP_ERROR_UNKNOWN = 1,
-  APP_ERROR_TYPE_MISMATCH = 2,
-  APP_ERROR_IO = 3,
-  APP_ERROR_SVC_NOT_AVAILABLE = 4,
-  APP_ERROR_SECURITY = 5,
-  APP_ERROR_NETWORK = 6,
-  APP_ERROR_NOT_SUPPORTED = 7,
-  APP_ERROR_NOT_FOUND = 8,
-  APP_ERROR_INVALID_ACCESS = 9,
-  APP_ERROR_ABORT = 10,
-  APP_ERROR_QUOTA_EXCEEDED = 11,
-  APP_ERROR_INVALID_STATE = 12,
-  APP_ERROR_INVALID_MODIFICATION = 13,
-  APP_ERROR_INVALID_VALUES = 14,
-};
-
-struct CallbackInfo {
-  ApplicationInstance* instance;
-  bool is_success;
-  int error_type;
-  char error_msg[256];
-  char id[256];
-  int callback_id;
-  picojson::object data;
-};
-
-static picojson::value GetAppError(int type, const char* msg) {
-  switch (type) {
-  case APP_ERROR_UNKNOWN:
-    return UnknownException(msg).ToJSON();
-  case APP_ERROR_TYPE_MISMATCH:
-    return TypeMismatchException(msg).ToJSON();
-  case APP_ERROR_IO:
-    return IOException(msg).ToJSON();
-  case APP_ERROR_SVC_NOT_AVAILABLE:
-    return ServiceNotAvailableException(msg).ToJSON();
-  case APP_ERROR_SECURITY:
-    return SecurityException(msg).ToJSON();
-  case APP_ERROR_NETWORK:
-    return NetworkException(msg).ToJSON();
-  case APP_ERROR_NOT_SUPPORTED:
-    return NotSupportedException(msg).ToJSON();
-  case APP_ERROR_NOT_FOUND:
-    return NotFoundException(msg).ToJSON();
-  case APP_ERROR_INVALID_ACCESS:
-    return InvalidAccessException(msg).ToJSON();
-  case APP_ERROR_ABORT:
-    return AbortException(msg).ToJSON();
-  case APP_ERROR_QUOTA_EXCEEDED:
-    return QuotaExceededException(msg).ToJSON();
-  case APP_ERROR_INVALID_STATE:
-    return InvalidStateException(msg).ToJSON();
-  case APP_ERROR_INVALID_MODIFICATION:
-    return InvalidModificationException(msg).ToJSON();
-  case APP_ERROR_INVALID_VALUES:
-    return InvalidValuesException(msg).ToJSON();
-  default:
-    return UnknownException(msg).ToJSON();
-  }
-}
-
-static void ReplyAsync(ApplicationInstance* instance,
-  int callback_id, bool isSuccess, picojson::object* param,
-  int err_id, const char* err_msg) {
-  (*param)["callbackId"] = picojson::value(static_cast<double>(callback_id));
-  if (isSuccess) {
-    (*param)["status"] = picojson::value("success");
-  } else {
-    (*param).insert(std::make_pair("status", picojson::value("error")));
-    (*param).insert(std::make_pair("error", GetAppError(err_id, err_msg)));
-  }
-
-  picojson::value result = picojson::value(*param);
-  char print_buf[300] = {0};
-  snprintf(print_buf, sizeof(print_buf), result.serialize().c_str());
-  LoggerD("async result: %s", print_buf);
-  instance->PostMessage(result.serialize().c_str());
-}
-
-// Callback of 'app_manager_foreach_app_context'
-// Used by 'getAppsContext'
-static bool app_manager_app_context_callback(app_context_h app_context,
-  void *user_data) {
-  int ret = 0;
-
-  char *app_id = NULL;
-  int pid;
-
-  std::string context_id;
-
-  if (user_data == NULL) {
-    LoggerD("user_data is NULL");
-    return false;
-  }
-
-  ret = app_context_get_app_id(app_context, &app_id);
-  if ((ret != APP_MANAGER_ERROR_NONE) || (app_id == NULL)) {
-    LoggerE("Fail to get app id from context");
-    return false;
-  }
-  LoggerD("app_context_get_app_id: %s", app_id);
-  ret = app_context_get_pid(app_context, &pid);
-  if (ret != APP_MANAGER_ERROR_NONE) {
-    LoggerE("Fail to get pid from context");
-    if (app_id)
-      free(app_id);
-    return false;
-  }
-  LoggerD("app_context_get_pid: %d", pid);
-
-  std::stringstream sstream;
-  sstream << pid;
-  context_id = sstream.str();
-
-  ApplicationContextPtr app_context_ptr(new ApplicationContext());
-  app_context_ptr->set_app_id(app_id);
-  app_context_ptr->set_context_id(context_id);
-
-  ApplicationContextArray* app_context_array_ptr =
-    reinterpret_cast<ApplicationContextArray*>(user_data);
-  app_context_array_ptr->push_back(app_context_ptr);
 
-  if (app_id)
-    free(app_id);
-
-  return true;
+#define REGISTER_SYNC(c, x) \
+        RegisterSyncHandler(c, std::bind(&ApplicationInstance::x, this, _1, _2));
+  //ApplicationManager
+  REGISTER_SYNC("ApplicationManager_getCurrentApplication", GetCurrentApplication);
+  REGISTER_SYNC("ApplicationManager_getAppContext", GetAppContext);
+  REGISTER_SYNC("ApplicationManager_getAppInfo", GetAppInfo);
+  REGISTER_SYNC("ApplicationManager_getAppCerts", GetAppCerts);
+  REGISTER_SYNC("ApplicationManager_getAppSharedURI", GetAppSharedURI);
+  REGISTER_SYNC("ApplicationManager_getAppMetaData", GetAppMetaData);
+  REGISTER_SYNC("ApplicationManager_addAppInfoEventListener", AddAppInfoEventListener);
+  REGISTER_SYNC("ApplicationManager_removeAppInfoEventListener", RemoveAppInfoEventListener);
+
+  //Application
+  REGISTER_SYNC("Application_getRequestedAppControl", GetRequestedAppControl);
+
+  //RequestedApplicationControl
+  REGISTER_SYNC("RequestedApplicationControl_replyResult", ReplyResult);
+  REGISTER_SYNC("RequestedApplicationControl_replyFailure", ReplyFailure);
+
+  //ApplicationInformation
+  REGISTER_SYNC("ApplicationInformation_getSize", GetSize);
+#undef REGISTER_SYNC
+
+#define REGISTER_ASYNC(c, x) \
+        RegisterSyncHandler(c, std::bind(&ApplicationInstance::x, this, _1, _2));
+  //ApplicationManager
+  REGISTER_ASYNC("ApplicationManager_kill", Kill);
+  REGISTER_ASYNC("ApplicationManager_launch", Launch);
+  REGISTER_ASYNC("ApplicationManager_launchAppControl", LaunchAppControl);
+  REGISTER_ASYNC("ApplicationManager_findAppControl", FindAppControl);
+  REGISTER_ASYNC("ApplicationManager_getAppsContext", GetAppsContext);
+  REGISTER_ASYNC("ApplicationManager_getAppsInfo", GetAppsInfo);
+#undef REGISTER_ASYNC
 }
 
-static int get_app_installed_size(const char* app_id) {
-  char* package_id = NULL;
-  int size = 0;
-  int ret = 0;
-
-  ret = package_manager_get_package_id_by_app_id(app_id, &package_id);
-  if ((ret != PACKAGE_MANAGER_ERROR_NONE) || (package_id == NULL)) {
-    LoggerE("Failed to get package id(%s)", package_id);
-  } else {
-    // get installed size from package server (to solve smack issue)
-    pkgmgr_client *pc = pkgmgr_client_new(PC_REQUEST);
-    if (pc == NULL) {
-      LoggerE("Failed to create pkgmgr client");
-    } else {
-      size = pkgmgr_client_request_service(PM_REQUEST_GET_SIZE,
-        PM_GET_TOTAL_SIZE, pc, NULL, package_id, NULL, NULL, NULL);
-      if (size < 0) {
-        LoggerE("Failed to get installed size");
-      }
-      pkgmgr_client_free(pc);
-      pc = NULL;
-    }
-
-    if (package_id) {
-      free(package_id);
-    }
-  }
-
-  // LoggerD("Get app size: %s[%d]", app_id, size);
-  return size;
-}
-
-// Callback from 'app_control_foreach_app_matched'
-// Used by 'findAppControl'
-static bool app_control_app_matched_callback(app_control_h service,
-  const char *appid, void *user_data) {
-  if (appid == NULL) {
-    LoggerD("appid is NULL");
-    return false;
-  }
-
-  pkgmgrinfo_appinfo_h handle;
-  int ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle);
-  if (ret != PMINFO_R_OK) {
-    LoggerD("Fail to get appInfo from appId : %s", appid);
-  } else {
-    LoggerD("Getting app info: %s", appid);
-    ApplicationInformationPtr app_info_ptr = get_app_info(handle);
-    pkgmgrinfo_appinfo_destroy_appinfo(handle);
-
-    ApplicationInformationArray* app_info_array =
-    reinterpret_cast<ApplicationInformationArray*>(user_data);
-
-    app_info_array->push_back(app_info_ptr);
-  }
-
-  return true;
+ApplicationInstance::~ApplicationInstance() {
+  LoggerD("Entered");
 }
 
-static bool app_control_extra_data_callback(app_control_h service,
-  const char* key, void* user_data) {
-  int ret = 0;
-  LoggerD("Handing extra data");
-
-  ApplicationControlDataArray* app_ctr_data_array =
-    reinterpret_cast<ApplicationControlDataArray*>(user_data);
-
-  bool is_array = false;
-  ret = app_control_is_extra_data_array(service, key, &is_array);
-  if (ret != APP_CONTROL_ERROR_NONE) {
-    LoggerE("service_is_extra_data_array passes error");
-    // fail to checking. go to next extra data.
-    return true;
-  }
-
-  std::string key_str(key);
-
-  if (is_array) {
-    LoggerD("extra data is array");
-    int length = 0;
-    char **value = NULL;
-
-    ret = app_control_get_extra_data_array(service, key, &value, &length);
-    switch (ret) {
-      case APP_CONTROL_ERROR_NONE: {
-        std::vector<std::string> val_array;
-        LoggerD("key: %s, value length : %d", key, length);
-        for (int i = 0; i < length; i++) {
-          if (value[i]) {
-            LoggerD("[%d] value: %s", i, value[i]);
-            val_array.push_back(value[i]);
-          }
-        }
-
-        ApplicationControlDataPtr app_control_data(
-          new ApplicationControlData());
-        app_control_data->set_ctr_key(key_str);
-        app_control_data->set_ctr_value(val_array);
-        app_ctr_data_array->push_back(app_control_data);
-
-        for (int i = 0; i < length; i++) {
-          if (value[i])
-            free(value[i]);
-        }
-        if (value)
-          free(value);
-        break;
-      }
-      case APP_CONTROL_ERROR_INVALID_PARAMETER:
-        LoggerE("get_extra_data retuns ERROR_INVALID_PARAMETER");
-        break;
-      case APP_CONTROL_ERROR_KEY_NOT_FOUND:
-        LoggerE("get_extra_data retuns ERROR_KEY_NOT_FOUND");
-        break;
-      case APP_CONTROL_ERROR_OUT_OF_MEMORY:
-        LoggerE("get_extra_data retuns ERROR_OUT_OF_MEMORY");
-        break;
-      default:
-        LoggerE("get_extra_data retuns Unknown Error");
-        break;
-    }
-  } else {  // (!is_array)
-    LoggerD("extra data is not array");
-    char *value = NULL;
-
-    ret = app_control_get_extra_data(service, key, &value);
-    switch (ret) {
-    case APP_CONTROL_ERROR_NONE: {
-      if (value == NULL) {
-        LoggerE("app_control_get_extra_data returns NULL");
-        break;
-      }
-
-      std::vector<std::string> val_array;
-      val_array.push_back(value);
-
-      ApplicationControlDataPtr app_control_data(new ApplicationControlData());
-      LoggerD("key: %s, value: %s", key, value);
-      app_control_data->set_ctr_key(key_str);
-      app_control_data->set_ctr_value(val_array);
-      app_ctr_data_array->push_back(app_control_data);
-
-      if (value)
-        free(value);
+void ApplicationInstance::GetCurrentApplication(const picojson::value& args, picojson::object& out) {
+  LoggerD("Entered");
 
-      break;
-    }
-    case APP_CONTROL_ERROR_INVALID_PARAMETER:
-      LoggerE("get_extra_data retuns ERROR_INVALID_PARAMETER");
-      break;
-    case APP_CONTROL_ERROR_KEY_NOT_FOUND:
-      LoggerE("get_extra_data retuns ERROR_KEY_NOT_FOUND");
-      break;
-    case APP_CONTROL_ERROR_OUT_OF_MEMORY:
-      LoggerE("get_extra_data retuns ERROR_OUT_OF_MEMORY");
-      break;
-    default:
-      LoggerE("get_extra_data retuns Known Error");
-      break;
-    }
-  }
-  return true;
+  manager_.GetCurrentApplication(app_id_, &out);
 }
 
-// Callback of 'app_control_send_launch_request'
-// Used by 'launchAppControl'
-static void app_control_reply_callback(app_control_h request,
-  app_control_h reply, app_control_result_e result, void *user_data) {
-  CallbackInfo* info = reinterpret_cast<CallbackInfo*>(user_data);
-
-  if (result == APP_CONTROL_RESULT_SUCCEEDED) {
-    LoggerD("APP_CONTROL_RESULT_SUCCEEDED");
-
-    // create new service object to store result.
-    ApplicationControlDataArrayPtr app_ctr_data_array_ptr(
-      new ApplicationControlDataArray());
-
-    int result = app_control_foreach_extra_data(reply,
-      app_control_extra_data_callback, app_ctr_data_array_ptr.get());
-    if (result == APP_CONTROL_ERROR_NONE) {
-      LoggerD("Getting extra data is succeeded.");
-    } else {
-      LoggerD("Getting extra data is failed.");
-    }
-
-    picojson::value replied_data = picojson::value(picojson::array());
-    picojson::array& replied_data_array = replied_data.get<picojson::array>();
-
-    for (int i = 0; i < app_ctr_data_array_ptr->size(); i++) {
-      ApplicationControlDataPtr ctr_data_ptr = app_ctr_data_array_ptr->at(i);
-
-      replied_data_array.push_back(ctr_data_ptr->Value());
-    }
-
-    // ReplyAsync
-    picojson::object data;
-    data.insert(std::make_pair("type", picojson::value("onsuccess")));
-    data.insert(std::make_pair("data", replied_data));
-    ReplyAsync(info->instance, info->callback_id, true, &data, 0, NULL);
-
-  } else if (result == APP_CONTROL_RESULT_FAILED ||
-             result == APP_CONTROL_RESULT_CANCELED) {
-    LoggerD("APP_CONTROL_RESULT_FAILED or CANCELED");
-
-    // ReplyAsync
-    picojson::object data;
-    data.insert(std::make_pair("type", picojson::value("onfailure")));
-    ReplyAsync(info->instance, info->callback_id, false, &data,
-      APP_ERROR_ABORT, "Failed or Canceled");
-  }
+void ApplicationInstance::GetAppContext(const picojson::value& args, picojson::object& out) {
+  LoggerD("Entered");
 
-  if (info)
-    free(info);
+  manager_.GetAppContext(args, &out);
 }
 
-// get package name by id
-static char* getPackageByAppId(const char* app_id) {
-  app_info_h handle;
-  char* pkgName;
-  int ret = 0;
-
-  // TODO(sunggyu.choi): gPkgIdMapInited
-
-  ret = app_manager_get_app_info(app_id, &handle);
-  if (ret < 0) {
-    LoggerE("Fail to get appinfo");
-    return NULL;
-  }
+void ApplicationInstance::GetAppInfo(const picojson::value& args, picojson::object& out) {
+  LoggerD("Entered");
 
-  ret = app_info_get_package(handle, &pkgName);
-  if (ret < 0) {
-    LoggerE("Fail to get pkgName");
-    pkgName = NULL;
+  std::string app_id = app_id_;
+  const auto& id = args.get("id");
+  if (id.is<std::string>()) {
+    app_id = id.get<std::string>();
   }
 
-  ret = app_info_destroy(handle);
-  if (ret < 0) {
-    LoggerE("Fail to get destory appinfo");
-    return NULL;
-  }
-  return pkgName;
+  manager_.GetAppInfo(app_id, &out);
 }
 
-static int category_cb(const char *category, void *user_data) {
-  LoggerD("category: %s", category);
-  if (category == NULL)
-    return true;
-
-  ApplicationInformation* appInfo =
-    reinterpret_cast<ApplicationInformation*>(user_data);
-  appInfo->add_categories(category);
-  return true;
-}
+void ApplicationInstance::GetAppCerts(const picojson::value& args, picojson::object& out) {
+  LoggerD("Entered");
 
-static bool package_certificate_cb(package_info_h handle,
-  package_cert_type_e cert_type, const char *cert_value, void *user_data) {
-  ApplicationCertificatePtr cert(new ApplicationCertificate());
-  std::string cert_type_name;
+  CHECK_PRIVILEGE_ACCESS(kPrivilegeAppManagerCertificate, &out);
 
-  switch (cert_type) {
-    case PACKAGE_INFO_AUTHOR_ROOT_CERT:
-      cert_type_name = "AUTHOR_ROOT";
-      break;
-    case PACKAGE_INFO_AUTHOR_INTERMEDIATE_CERT:
-      cert_type_name = "AUTHOR_INTERMEDIATE";
-      break;
-    case PACKAGE_INFO_AUTHOR_SIGNER_CERT:
-      cert_type_name = "AUTHOR_SIGNER";
-      break;
-    case PACKAGE_INFO_DISTRIBUTOR_ROOT_CERT:
-      cert_type_name = "DISTRIBUTOR_ROOT";
-      break;
-    case PACKAGE_INFO_DISTRIBUTOR_INTERMEDIATE_CERT:
-      cert_type_name = "DISTRIBUTOR_INTERMEDIATE";
-      break;
-    case PACKAGE_INFO_DISTRIBUTOR_SIGNER_CERT:
-      cert_type_name = "DISTRIBUTOR_SIGNER";
-      break;
-    case PACKAGE_INFO_DISTRIBUTOR2_ROOT_CERT:
-      cert_type_name = "DISTRIBUTOR2_ROOT";
-      break;
-    case PACKAGE_INFO_DISTRIBUTOR2_INTERMEDIATE_CERT:
-      cert_type_name = "DISTRIBUTOR2_INTERMEDIATE";
-      break;
-    case PACKAGE_INFO_DISTRIBUTOR2_SIGNER_CERT:
-      cert_type_name = "DISTRIBUTOR2_SIGNER";
-      break;
-    default:
-      LoggerE("Unknow Cert type!!!");
-      cert_type_name = "UNKNOWN";
-      break;
+  std::string app_id = app_id_;
+  const auto& id = args.get("id");
+  if (id.is<std::string>()) {
+    app_id = id.get<std::string>();
   }
 
-  cert->set_cert_type(cert_type_name);
-  std::string cert_type_value = cert_value;
-  cert->set_cert_value(cert_type_value);
-
-  ApplicationCertificateArray *certs =
-    reinterpret_cast<ApplicationCertificateArray*>(user_data);
-
-  certs->push_back(cert);
-  return true;
+  manager_.GetAppCerts(app_id, &out);
 }
 
-static ApplicationInformationPtr get_app_info(pkgmgrinfo_appinfo_h handle) {
-  char* app_id = NULL;
-  char* name = NULL;
-  char* icon_path = NULL;
-  bool no_display = false;
-  char* pkg_id = NULL;
-  int ret = 0;
-
-  ApplicationInformationPtr app_info(new ApplicationInformation());
-  ret = pkgmgrinfo_appinfo_get_appid(handle, &app_id);
-  if (ret != PMINFO_R_OK) {
-    LoggerD("Fail to get appid");
-  } else {
-    app_info->set_app_id(app_id);
-  }
-
-  ret = pkgmgrinfo_appinfo_get_label(handle, &name);
-  if ((ret != PMINFO_R_OK) || (name == NULL)) {
-    LoggerD("Fail to get label");
-  } else {
-    app_info->set_name(name);
-  }
-
-  ret = pkgmgrinfo_appinfo_get_icon(handle, &icon_path);
-  if ((ret != PMINFO_R_OK) || (icon_path == NULL)) {
-    LoggerD("Fail to get icon");
-  } else {
-    app_info->set_icon_path(icon_path);
-  }
-
-  ret = pkgmgrinfo_appinfo_foreach_category(handle, category_cb,
-    reinterpret_cast<void*>(app_info.get()));
-  if (ret != PMINFO_R_OK) {
-    LoggerD("Fail to get categories");
-  }
-
-  ret = pkgmgrinfo_appinfo_is_nodisplay(handle, &no_display);
-  if (ret != PMINFO_R_OK) {
-    LoggerD("Fail to get nodisplay");
-  } else {
-    app_info->set_show(!no_display);
-  }
-
-  ret = pkgmgrinfo_appinfo_get_pkgid(handle, &pkg_id);
-  if ((ret != PMINFO_R_OK) || (pkg_id == NULL)) {
-    LoggerD("Fail to get pkgId");
-    return app_info;
-  } else {
-    app_info->set_package_id(pkg_id);
-  }
-
-  char* version = NULL;
-  int installed_time = 0;
-  pkgmgrinfo_pkginfo_h pkginfo_h;
-
-  ret = pkgmgrinfo_pkginfo_get_pkginfo(pkg_id, &pkginfo_h);
-  if (ret != PMINFO_R_OK) {
-    LoggerE("Fail to get pkginfo");
-  } else {
-    ret = pkgmgrinfo_pkginfo_get_version(pkginfo_h, &version);
-    if (ret != PMINFO_R_OK) {
-      LoggerE("Fail to get version");
-    } else {
-      app_info->set_version(version);
-    }
-
-    ret = pkgmgrinfo_pkginfo_get_installed_time(pkginfo_h, &installed_time);
-    if (ret != PMINFO_R_OK) {
-      LoggerE("Fail to get installed time");
-    } else {
-      app_info->set_install_date(installed_time);
-      // LoggerD("installed_time: %d", installed_time);
-    }
+void ApplicationInstance::GetAppSharedURI(const picojson::value& args, picojson::object& out) {
+  LoggerD("Entered");
 
-    pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
+  std::string app_id = app_id_;
+  const auto& id = args.get("id");
+  if (id.is<std::string>()) {
+    app_id = id.get<std::string>();
   }
 
-  // size
-  app_info->set_size(get_app_installed_size(app_id));
-  return app_info;
+  manager_.GetAppSharedUri(app_id, &out);
 }
 
-static int app_meta_data_cb(const char *meta_key, const char *meta_value,
-  void *user_data) {
-  if ((meta_key == NULL)  || (meta_value == NULL)) {
-    LoggerE("meta_key or meta_value is null");
-    return 0;
-  }
-
-  LoggerD("key = %s, value = %s", meta_key, meta_value);
-  ApplicationMetaDataPtr meta_data(new ApplicationMetaData());
-
-  std::string key = meta_key;
-  meta_data->set_meta_key(key);
-  std::string value = meta_value;
-  meta_data->set_meta_value(value);
-
-  ApplicationMetaDataArray* meta_data_array =
-    reinterpret_cast<ApplicationMetaDataArray*>(user_data);
-  meta_data_array->push_back(meta_data);
-
-  return 0;
-}
-
-static int installed_app_info_cb(pkgmgrinfo_appinfo_h handle,
-  void *user_data) {
-  // LoggerD("ENTER");
-  ApplicationInformationPtr app_info = get_app_info(handle);
-  ApplicationInformationArray* app_info_array =
-    reinterpret_cast<ApplicationInformationArray*>(user_data);
-  app_info_array->push_back(app_info);
-  return 0;
-}
+void ApplicationInstance::GetAppMetaData(const picojson::value& args, picojson::object& out) {
+  LoggerD("Entered");
 
-// Callback from 'app_manager_set_app_context_event_cb'
-// Used by 'kill'
-static void app_manager_app_context_event_callback(app_context_h app_context,
-  app_context_event_e event, void *user_data) {
-  CallbackInfo* info =
-    reinterpret_cast<CallbackInfo*>(user_data);
-  int ret = 0;
+  CHECK_PRIVILEGE_ACCESS(kPrivilegeApplicationInfo, &out);
 
-  LoggerD("context_id: %s, callback_id: %d", info->id, info->callback_id);
-  if (event != APP_CONTEXT_EVENT_TERMINATED) {
-    picojson::object data;
-    info->error_type = APP_ERROR_UNKNOWN;
-    snprintf(info->error_msg, sizeof(info->error_msg), "Not terminated.");
-    ReplyAsync(info->instance, info->callback_id,
-               false, &data, info->error_type, info->error_msg);
-  } else {
-    picojson::object data;
-    ReplyAsync(info->instance, info->callback_id,
-               true, &data, 0, NULL);
+  std::string app_id = app_id_;
+  const auto& id = args.get("id");
+  if (id.is<std::string>()) {
+    app_id = id.get<std::string>();
   }
 
-  if (info)
-    free(info);
+  manager_.GetAppMetaData(app_id, &out);
 }
 
-static gboolean getappsinfo_callback_thread_completed(
-  const std::shared_ptr<CallbackInfo>& user_data) {
+void ApplicationInstance::AddAppInfoEventListener(const picojson::value& args, picojson::object& out) {
   LoggerD("Entered");
 
-  if (user_data->is_success) {
-    ReplyAsync(user_data->instance, user_data->callback_id,
-               true, &(user_data->data), 0, NULL);
-  } else {
-    picojson::object data;
-    ReplyAsync(user_data->instance, user_data->callback_id,
-               false, &data, user_data->error_type, user_data->error_msg);
-  }
-    return true;
-}
-
-static void* getappsinfo_callback_thread(
-  const std::shared_ptr<CallbackInfo>& user_data) {
-  LoggerD("Entered.");
-  ApplicationInformationArrayPtr app_info_array_ptr(
-    new ApplicationInformationArray());
-
-  int ret = pkgmgrinfo_appinfo_get_installed_list(installed_app_info_cb,
-    app_info_array_ptr.get());
-  if (ret == PMINFO_R_OK) {
-    LoggerE("pkgmgrinfo_appinfo_get_installed_list: ERROR_NONE");
-    user_data->is_success = true;
-
-    picojson::value apps_infos = picojson::value(picojson::array());
-    picojson::array& apps_infos_array = apps_infos.get<picojson::array>();
-
-    for (int i = 0; i < app_info_array_ptr->size(); i++) {
-      ApplicationInformationPtr app_info_ptr = app_info_array_ptr->at(i);
-
-      apps_infos_array.push_back(app_info_ptr->Value());
-    }
-    user_data->data.insert(std::make_pair("informationArray", apps_infos));
-  } else {
-    LoggerE("pkgmgrinfo_appinfo_get_installed_list: ERROR");
-
-    user_data->error_type = APP_ERROR_UNKNOWN;
-    snprintf(user_data->error_msg, sizeof(user_data->error_msg), "Unknown");
+  manager_.StartAppInfoEventListener(&out);
+ }
 
-    user_data->is_success = false;
-  }
-}
-
-static gboolean getappsctx_callback_thread_completed(
-  const std::shared_ptr<CallbackInfo>& user_data) {
+void ApplicationInstance::RemoveAppInfoEventListener(const picojson::value& args, picojson::object& out) {
   LoggerD("Entered");
 
-  if (user_data->is_success) {
-    ReplyAsync(user_data->instance, user_data->callback_id,
-               true, &(user_data->data), 0, NULL);
-  } else {
-    picojson::object data;
-    ReplyAsync(user_data->instance, user_data->callback_id,
-               false, &data, user_data->error_type, user_data->error_msg);
-  }
-  return true;
-}
-
-static void* getappsctx_callback_thread(
-  const std::shared_ptr<CallbackInfo>& user_data) {
-  LoggerD("Entered.");
-  ApplicationContextArrayPtr app_context_array_ptr(
-    new ApplicationContextArray());
-
-  int ret = app_manager_foreach_app_context(app_manager_app_context_callback,
-    app_context_array_ptr.get());
-  if (ret == APP_MANAGER_ERROR_NONE) {
-    LoggerE("app_manager_foreach_app_context error: ERROR_NONE");
-    user_data->is_success = true;
-
-    picojson::value apps_contexts = picojson::value(picojson::array());
-    picojson::array& apps_contexts_array =
-      apps_contexts.get<picojson::array>();
-
-    for (int i = 0; i < app_context_array_ptr->size(); i++) {
-      ApplicationContextPtr app_ctx_ptr = app_context_array_ptr->at(i);
-
-      apps_contexts_array.push_back(app_ctx_ptr->Value());
-    }
-    user_data->data.insert(std::make_pair("contexts", apps_contexts));
-
-  } else {
-    LoggerE("app_manager_foreach_app_context error: ERROR");
-
-    if (ret == APP_MANAGER_ERROR_INVALID_PARAMETER) {
-      user_data->error_type = APP_ERROR_TYPE_MISMATCH;
-      snprintf(user_data->error_msg, sizeof(user_data->error_msg),
-        "Invalid parameter");
-    } else if (ret == APP_MANAGER_ERROR_PERMISSION_DENIED) {
-      user_data->error_type = APP_ERROR_ABORT;
-      snprintf(user_data->error_msg, sizeof(user_data->error_msg),
-        "Permission denied");
-    } else {
-      user_data->error_type = APP_ERROR_UNKNOWN;
-      snprintf(user_data->error_msg, sizeof(user_data->error_msg),
-        "Unknown");
-    }
-
-    user_data->is_success = false;
-  }
+  manager_.StopAppInfoEventListener();
+  ReportSuccess(out);
 }
 
-static gboolean callback_thread_completed
-  (const std::shared_ptr<CallbackInfo>& user_data) {
+void ApplicationInstance::GetRequestedAppControl(const picojson::value& args, picojson::object& out) {
   LoggerD("Entered");
-  picojson::object data;
 
-  if (user_data->is_success) {
-    ReplyAsync(user_data->instance, user_data->callback_id,
-               true, &data, 0, NULL);
-  } else {
-    ReplyAsync(user_data->instance, user_data->callback_id,
-               false, &data, user_data->error_type, user_data->error_msg);
-  }
-  return true;
+  current_application_.GetRequestedAppControl(args, &out);
 }
 
-static gboolean find_callback_thread_completed
-  (const std::shared_ptr<CallbackInfo>& user_data) {
+void ApplicationInstance::ReplyResult(const picojson::value& args, picojson::object& out) {
   LoggerD("Entered");
-  picojson::object data;
-
-  if (user_data->is_success) {
-    ReplyAsync(user_data->instance, user_data->callback_id,
-               true, &(user_data->data), 0, NULL);
-  } else {
-    ReplyAsync(user_data->instance, user_data->callback_id,
-               false, &data, user_data->error_type, user_data->error_msg);
-  }
-  return true;
-}
 
-static void* callback_thread
-  (const std::shared_ptr<CallbackInfo>& user_data) {
-  LoggerD("Entered. currently, nothing to do");
+  current_application_.app_control().ReplyResult(args, &out);
 }
 
-static gboolean launch_completed
-  (const std::shared_ptr<CallbackInfo>& user_data) {
+void ApplicationInstance::ReplyFailure(const picojson::value& args, picojson::object& out) {
   LoggerD("Entered");
-  picojson::object data;
 
-  if (user_data->is_success) {
-    ReplyAsync(user_data->instance, user_data->callback_id,
-               true, &data, 0, NULL);
-  } else {
-    ReplyAsync(user_data->instance, user_data->callback_id,
-               false, &data, user_data->error_type, user_data->error_msg);
-  }
-  return true;
+  current_application_.app_control().ReplyFailure(&out);
 }
 
-static gboolean self_kill_completed
-  (const std::shared_ptr<CallbackInfo>& user_data) {
+void ApplicationInstance::GetSize(const picojson::value& args, picojson::object& out) {
   LoggerD("Entered");
-  picojson::object data;
-
-  // call error callback with InvalidValuesException
-  ReplyAsync(user_data->instance, user_data->callback_id,
-             false, &data, user_data->error_type, user_data->error_msg);
-  return true;
-}
-
-static void* launch_thread(const std::shared_ptr<CallbackInfo>& user_data) {
-  int ret;
 
-  LoggerD("app_id: %s, callback_id: %d", user_data->id,
-    user_data->callback_id);
+  CHECK_PRIVILEGE_ACCESS(kPrivilegeApplicationInfo, &out);
 
-  ret = aul_open_app(user_data->id);
-  if (ret < 0) {
-    std::string msg;
-    int type = APP_ERROR_OK;
-    switch (ret) {
-      case AUL_R_EINVAL:
-      case AUL_R_ERROR:
-        LoggerE("Not Found error");
-        msg = "Not Found error";
-        type = APP_ERROR_NOT_FOUND;
-        break;
-      case AUL_R_ECOMM:
-        LoggerE("Internal IPC error");
-        msg = "Internal IPC error";
-        type = APP_ERROR_IO;
-        break;
-      default:
-        LoggerE("Unknown error");
-        msg = "Unknown error";
-        type = APP_ERROR_UNKNOWN;
-        break;
-    }
-    user_data->is_success = false;
-    user_data->error_type = type;
-    snprintf(user_data->error_msg, sizeof(user_data->error_msg), msg.c_str());
-  } else {
-    LoggerD("Success to launch.");
-    user_data->is_success = true;
-  }
+  manager_.GetApplicationInformationSize(args, &out);
 }
 
-#define CHECK_EXIST(args, name, out) \
-    if (!args.contains(name)) {\
-      ReportError(TypeMismatchException(name" is required argument"), out);\
-      return;\
-    }
-
-void ApplicationInstance::AppMgrGetCurrentApplication(
-  const picojson::value& args, picojson::object& out) {
-  const std::string& app_id = app_id_;
-  LoggerD("app_id: %s", app_id.c_str());
-
-  pkgmgrinfo_appinfo_h handle;
-  int ret = pkgmgrinfo_appinfo_get_appinfo(app_id.c_str(), &handle);
-  if (ret != PMINFO_R_OK) {
-    LoggerE("Fail to get appInfo");
-    ReportError(UnknownException("get_appinfo error : unknown error"), out);
-    return;
-  }
-
-  ApplicationInformationPtr app_info_ptr = get_app_info(handle);
-  pkgmgrinfo_appinfo_destroy_appinfo(handle);
-
-  ApplicationPtr app_ptr = ApplicationPtr(new Application());
-  app_ptr->set_app_info(app_info_ptr);
-
-  LoggerD("set appinfo to application");
-  {
-    int pid = getpid();  // DO NOT USE getppid();
-    LoggerD("context id = %d", pid);
-
-    std::stringstream sstr;
-    sstr << pid;
-    app_ptr->set_context_id(sstr.str());
-  }
-
-  ReportSuccess(app_ptr->Value(), out);
-}
+void ApplicationInstance::Kill(const picojson::value& args, picojson::object& out) {
+  LoggerD("Entered");
 
-void ApplicationInstance::AppMgrKill(const picojson::value& args,
-  picojson::object& out) {
   CHECK_PRIVILEGE_ACCESS(kPrivilegeAppManagerKill, &out);
 
-  CHECK_EXIST(args, "callbackId", out)
-
-  int callback_id = static_cast<int>(args.get("callbackId").get<double>());
-  const std::string& context_id = args.get("contextId").get<std::string>();
-
-  LoggerD("callbackId = %d", callback_id);
-  LoggerD("contextId = %s", context_id.c_str());
-
-  if (context_id.empty()) {
-    LoggerE("contextId is mandatory field.");
-    ReportError(InvalidValuesException("Context id is mandatory field."), out);
-    return;
-  }
-
-  int ret;
-  int pid;
-  std::stringstream(context_id) >> pid;
-
-  if (pid <= 0) {
-    LoggerE("Given context id is wrong.");
-    ReportError(InvalidValuesException("Given context id is wrong."), out);
-    return;
-  }
-
-  // TC checks this case via error callback... moved it to callback
-  // if kill request is come for current context,
-  // throw InvalidValueException by spec
-  if (pid == getpid()) {
-    LoggerE("Given context id is same with me.");
-
-    auto user_data = std::shared_ptr<CallbackInfo>(new CallbackInfo);
-    user_data->instance = this;
-    user_data->callback_id = callback_id;
-    user_data->error_type = APP_ERROR_INVALID_VALUES;
-    snprintf(user_data->error_msg, sizeof(user_data->error_msg),
-      "Given context id is same with me.");
-
-    common::TaskQueue::GetInstance().Queue<CallbackInfo>(
-      callback_thread, self_kill_completed, user_data);
-
-    ReportSuccess(out);
-    return;
-  }
-
-  char *app_id_cstr = NULL;
-  ret = app_manager_get_app_id(pid, &app_id_cstr);
-  if (ret != APP_MANAGER_ERROR_NONE) {
-    LoggerE("Error while getting app id");
-    ReportError(NotFoundException("Error while getting app id"), out);
-    return;
-  }
-
-  std::string app_id = app_id_cstr;
-  free(app_id_cstr);
-
-  app_context_h app_context;
-  ret = app_manager_get_app_context(app_id.c_str(), &app_context);
-  if (ret != APP_MANAGER_ERROR_NONE) {
-    LoggerE("Error while getting app context");
-    ReportError(NotFoundException("Error while getting app context"), out);
-    return;
-  }
-
-  CallbackInfo* info = new CallbackInfo;
-  info->instance = this;
-  snprintf(info->id, sizeof(info->id), "%s", context_id.c_str());
-  info->callback_id = callback_id;
-
-  ret = app_manager_set_app_context_event_cb(
-    app_manager_app_context_event_callback, reinterpret_cast<void*>(info));
-  if (ret != APP_MANAGER_ERROR_NONE) {
-    if (info)
-      free(info);
-    LoggerE("Error while registering app context event");
-    ReportError(InvalidValuesException(
-      "Error while registering app context event"), out);
-    return;
-  }
-
-  ret = app_manager_terminate_app(app_context);
-  if (ret != APP_MANAGER_ERROR_NONE) {
-    if (info)
-      free(info);
-    LoggerE("Error while terminating app");
-    ReportError(InvalidValuesException("Error while terminating app"), out);
-    return;
-  }
-
-  ReportSuccess(out);
+  manager_.Kill(args);
 }
 
-void ApplicationInstance::AppMgrLaunch(const picojson::value& args,
-  picojson::object& out) {
-  CHECK_PRIVILEGE_ACCESS(kPrivilegeApplicationLaunch, &out);
-
-  CHECK_EXIST(args, "callbackId", out)
-
-  int callback_id = static_cast<int>(args.get("callbackId").get<double>());
-  const std::string& id = args.get("id").get<std::string>();
-
-  LoggerD("callbackId = %d", callback_id);
-  LoggerD("appId = %s", id.c_str());
-
-  if (id.empty()) {
-    LoggerE("app_id is mandatory field.");
-    ReportError(InvalidValuesException("App id is mandatory field."), out);
-    return;
-  }
-
-  auto user_data = std::shared_ptr<CallbackInfo>(new CallbackInfo);
-  user_data->instance = this;
-  snprintf(user_data->id, sizeof(user_data->id), "%s", id.c_str());
-  user_data->callback_id = callback_id;
-
-  common::TaskQueue::GetInstance().Queue<CallbackInfo>(
-    launch_thread, launch_completed, user_data);
-
-  ReportSuccess(out);
-}
+void ApplicationInstance::Launch(const picojson::value& args, picojson::object& out) {
+  LoggerD("Entered");
 
-void ApplicationInstance::AppMgrLaunchAppControl(const picojson::value& args,
-  picojson::object& out) {
   CHECK_PRIVILEGE_ACCESS(kPrivilegeApplicationLaunch, &out);
 
-  CHECK_EXIST(args, "callbackId", out)
-
-  int callback_id = static_cast<int>(args.get("callbackId").get<double>());
-  LoggerD("callbackId = %d", callback_id);
-  std::string id;  // app id is optional
-  if (args.contains("id")) {
-    id = args.get("id").get<std::string>();
-    LoggerD("app_id = %s", id.c_str());
-  }
-  std::string launchMode;  // launch mode is optional
-  if (args.contains("launchMode")) {
-    launchMode = args.get("launchMode").get<std::string>();
-    LoggerD("launchMode = %s", launchMode.c_str());
-  }
-  ApplicationControlPtr app_ctr_ptr(new ApplicationControl());
-
-  picojson::value app_control = args.get("appControl");
-  std::string operation = app_control.get("operation").get<std::string>();
-  app_ctr_ptr->set_operation(operation);
-  LoggerD("operation: %s", operation.c_str());
-
-  if (app_control.contains("uri")) {
-    if (app_control.get("uri").is<picojson::null>() == false) {
-      std::string uri = app_control.get("uri").get<std::string>();
-      app_ctr_ptr->set_uri(uri);
-    } else {
-      LoggerD("uri is null");
-    }
-  }
-
-  if (app_control.contains("mime")) {
-    if (app_control.get("mime").is<picojson::null>() == false) {
-      std::string mime = app_control.get("mime").get<std::string>();
-      app_ctr_ptr->set_mime(mime);
-    } else {
-      LoggerD("mime is null");
-    }
-  }
-
-  if (app_control.contains("category")) {
-    if (app_control.get("category").is<picojson::null>() == false) {
-      std::string category = app_control.get("category").get<std::string>();
-      app_ctr_ptr->set_category(category);
-    } else {
-      LoggerD("category is null");
-    }
-  }
-
-  if (app_control.contains("data")) {
-    if (app_control.get("data").is<picojson::null>() == false) {
-      std::vector<picojson::value> data_array =
-        app_control.get("data").get<picojson::array>();
-      for (int i = 0; i < data_array.size(); i++) {
-        ApplicationControlDataPtr ctr_data_ptr(new ApplicationControlData());
-
-        picojson::value each_data = data_array.at(i);
-        std::string key = each_data.get("key").get<std::string>();
-        LoggerD("%d: key = %s", i, key.c_str());
-
-        ctr_data_ptr->set_ctr_key(key);
-
-        std::vector<picojson::value> values =
-          each_data.get("value").get<picojson::array>();
-        for (int j = 0; j < values.size(); j++) {
-          std::string val = values.at(i).to_str();
-
-          ctr_data_ptr->add_ctr_value(val);
-          LoggerD("-%d val = %s", j, val.c_str());
-        }
-        app_ctr_ptr->add_data_array(ctr_data_ptr);
-      }
-    } else {
-      LoggerD("data is null.");
-    }
-  }
-
-  // check parameters
-  if (operation.empty()) {
-    LoggerE("operation is mandatory field.");
-    ReportError(InvalidValuesException("operation is mandatory field."), out);
-    return;
-  }
-
-  app_control_h service;
-  int ret = app_control_create(&service);
-  if (ret != APP_CONTROL_ERROR_NONE) {
-    ReportError(UnknownException("Creating app_control is failed."), out);
-    return;
-  }
-
-  if (id.empty() == false) {
-    LoggerD("set_app_id: %s", id.c_str());
-    ret = app_control_set_app_id(service, id.c_str());
-    if (ret != APP_CONTROL_ERROR_NONE) {
-      ReportError(UnknownException("Setting app_id is failed."), out);
-      app_control_destroy(service);
-      return;
-    }
-  } else {
-    LoggerD("app_id is empty");
-  }
-
-  if (!launchMode.empty()) {
-    app_control_launch_mode_e launch_mode;
-    if (launchMode == "SINGLE") {
-      launch_mode = APP_CONTROL_LAUNCH_MODE_SINGLE;
-    } else if (launchMode == "GROUP") {
-      launch_mode = APP_CONTROL_LAUNCH_MODE_GROUP;
-    } else {
-      LoggerE("Invalid launch mode!");
-      ReportError(UnknownException("Invalid launch mode"), out);
-      app_control_destroy(service);
-      return;
-    }
-    ret = app_control_set_launch_mode(service, launch_mode);
-    if (ret != APP_CONTROL_ERROR_NONE) {
-      ReportError(UnknownException("Setting app_id is failed."), out);
-      app_control_destroy(service);
-      return;
-    }
-  }
-
-  ret = app_control_set_operation(service, operation.c_str());
-  if (ret != APP_CONTROL_ERROR_NONE) {
-    ReportError(InvalidValuesException("operation is invalid parameter"), out);
-    app_control_destroy(service);
-    return;
-  }
-
-  std::string uri = app_ctr_ptr->get_uri();
-  if (!uri.empty()) {
-    ret = app_control_set_uri(service, uri.c_str());
-    if (ret != APP_CONTROL_ERROR_NONE) {
-      ReportError(InvalidValuesException("uri is invalid parameter"), out);
-      app_control_destroy(service);
-      return;
-    }
-  }
-
-  std::string mime = app_ctr_ptr->get_mime();
-  if (!mime.empty()) {
-    ret = app_control_set_mime(service, mime.c_str());
-    if (ret != APP_CONTROL_ERROR_NONE) {
-      ReportError(InvalidValuesException("mime is invalid parameter"), out);
-      app_control_destroy(service);
-      return;
-    }
-  }
-
-  std::string category = app_ctr_ptr->get_category();
-  if (!category.empty()) {
-    ret = app_control_set_category(service, category.c_str());
-    if (ret != APP_CONTROL_ERROR_NONE) {
-      ReportError(InvalidValuesException("category is invalid parameter"),
-        out);
-      app_control_destroy(service);
-      return;
-    }
-  }
-
-  CallbackInfo* info = new CallbackInfo;
-  info->instance = this;
-  info->callback_id = callback_id;
-
-  LoggerD("Try to launch...");
-  ret = app_control_send_launch_request(service,
-    app_control_reply_callback, reinterpret_cast<void*>(info));
-
-  auto user_data = std::shared_ptr<CallbackInfo>(new CallbackInfo);
-  user_data->instance = this;
-  user_data->callback_id = callback_id;
-
-  if (ret != APP_CONTROL_ERROR_NONE) {
-    switch (ret) {
-      case APP_CONTROL_ERROR_INVALID_PARAMETER:
-        LoggerD("launch_request is failed. ERROR_INVALID_PARAMETER");
-        user_data->error_type = APP_ERROR_TYPE_MISMATCH;
-        snprintf(user_data->error_msg, sizeof(user_data->error_msg),
-          "launch_request is failed. INVALID_PARAMETER");
-        break;
-      case APP_CONTROL_ERROR_OUT_OF_MEMORY:
-        LoggerD("launch_request is failed. ERROR_OUT_OF_MEMORY");
-        user_data->error_type = APP_ERROR_UNKNOWN;
-        snprintf(user_data->error_msg, sizeof(user_data->error_msg),
-          "launch_request is failed. OUT_OF_MEMORY");
-        break;
-      case APP_CONTROL_ERROR_LAUNCH_REJECTED:
-        LoggerD("launch_request is failed. ERROR_LAUNCH_REJECTED");
-        user_data->error_type = APP_ERROR_ABORT;
-        snprintf(user_data->error_msg, sizeof(user_data->error_msg),
-          "launch_request is failed. LAUNCH_REJECTED");
-        break;
-      case APP_CONTROL_ERROR_APP_NOT_FOUND:
-        LoggerD("launch_request is failed. ERROR_APP_NOT_FOUND");
-        user_data->error_type = APP_ERROR_NOT_FOUND;
-        snprintf(user_data->error_msg, sizeof(user_data->error_msg),
-          "launch_request is failed. NOT_FOUND");
-        break;
-      default:
-        LoggerD("launch_request is failed.");
-        user_data->error_type = APP_ERROR_UNKNOWN;
-        snprintf(user_data->error_msg, sizeof(user_data->error_msg),
-          "launch_request is failed. UNKNOWN");
-        break;
-    }
-    user_data->is_success = false;
-  } else {
-    user_data->is_success = true;
-  }
-  // This causes to invalidate callback. This is not expected.
-  // TODO: Refactor launchAppControl
-  //common::TaskQueue::GetInstance().Queue<CallbackInfo>(
-  //  callback_thread, callback_thread_completed, user_data);
-
-  ret = app_control_destroy(service);
-  if (ret != APP_CONTROL_ERROR_NONE) {
-    LoggerD("app_control_destroy is failed");
-  }
-
-  ReportSuccess(out);
-}
-
-void ApplicationInstance::AppMgrFindAppControl(const picojson::value& args,
-  picojson::object& out) {
-  CHECK_EXIST(args, "callbackId", out)
-
-  int callback_id = static_cast<int>(args.get("callbackId").get<double>());
-  LoggerD("callbackId = %d", callback_id);
-
-  ApplicationControlPtr app_ctr_ptr(new ApplicationControl());
-
-  picojson::value app_control = args.get("appControl");
-  char print_buf[300] = {0};
-  snprintf(print_buf, sizeof(print_buf), app_control.serialize().c_str());
-  LoggerD("appControl: %s", print_buf);
-  std::string operation = app_control.get("operation").get<std::string>();
-  app_ctr_ptr->set_operation(operation);
-  LoggerD("operation: %s", operation.c_str());
-
-  if (app_control.contains("uri")) {
-    if (app_control.get("uri").is<picojson::null>() == false) {
-      std::string uri = app_control.get("uri").get<std::string>();
-      app_ctr_ptr->set_uri(uri);
-    } else {
-      LoggerD("uri is null");
-    }
-  }
-
-  if (app_control.contains("mime")) {
-    if (app_control.get("mime").is<picojson::null>() == false) {
-      std::string mime = app_control.get("mime").get<std::string>();
-      app_ctr_ptr->set_mime(mime);
-    } else {
-      LoggerD("mime is null");
-    }
-  }
-
-  if (app_control.contains("category")) {
-    if (app_control.get("category").is<picojson::null>() == false) {
-      std::string category = app_control.get("category").get<std::string>();
-      app_ctr_ptr->set_category(category);
-    } else {
-      LoggerD("category is null");
-    }
-  }
-
-  if (app_control.contains("data")) {
-    if (app_control.get("data").is<picojson::null>() == false) {
-      std::vector<picojson::value> data_array =
-        app_control.get("data").get<picojson::array>();
-      for (int i = 0; i < data_array.size(); i++) {
-        ApplicationControlDataPtr ctr_data_ptr(new ApplicationControlData());
-
-        picojson::value each_data = data_array.at(i);
-        std::string key = each_data.get("key").get<std::string>();
-        LoggerD("%d: key = %s", i, key.c_str());
-
-        ctr_data_ptr->set_ctr_key(key);
-
-        std::vector<picojson::value> values =
-          each_data.get("value").get<picojson::array>();
-        for (int j = 0; j < values.size(); j++) {
-          std::string val = values.at(i).to_str();
-
-          ctr_data_ptr->add_ctr_value(val);
-          LoggerD("-%d val = %s", j, val.c_str());
-        }
-
-        app_ctr_ptr->add_data_array(ctr_data_ptr);
-      }
-    } else {
-      LoggerD("data is null.");
-    }
-  }
-
-  // check parameters
-  if (operation.empty()) {
-    LoggerE("operation is mandatory field.");
-    ReportError(InvalidValuesException("operation is mandatory field."), out);
-    return;
-  }
-
-  app_control_h service;
-  int ret = app_control_create(&service);
-  if (ret != APP_CONTROL_ERROR_NONE) {
-    ReportError(UnknownException("Creating app_control is failed."), out);
-    app_control_destroy(service);
-    return;
-  }
-
-  ret = app_control_set_operation(service, operation.c_str());
-  if (ret != APP_CONTROL_ERROR_NONE) {
-    ReportError(InvalidValuesException("operation is invalid parameter"), out);
-    app_control_destroy(service);
-    return;
-  }
-
-  std::string uri = app_ctr_ptr->get_uri();
-  if (!uri.empty()) {
-    ret = app_control_set_uri(service, uri.c_str());
-    if (ret != APP_CONTROL_ERROR_NONE) {
-      ReportError(InvalidValuesException("uri is invalid parameter"), out);
-      app_control_destroy(service);
-      return;
-    }
-  }
-
-  std::string mime = app_ctr_ptr->get_mime();
-  if (!mime.empty()) {
-    ret = app_control_set_mime(service, mime.c_str());
-    if (ret != APP_CONTROL_ERROR_NONE) {
-      ReportError(InvalidValuesException("mime is invalid parameter"), out);
-      app_control_destroy(service);
-      return;
-    }
-  }
-
-  std::string category = app_ctr_ptr->get_category();
-  if (!category.empty()) {
-    ret = app_control_set_category(service, category.c_str());
-    if (ret != APP_CONTROL_ERROR_NONE) {
-      ReportError(InvalidValuesException("category is invalid parameter"),
-        out);
-      app_control_destroy(service);
-      return;
-    }
-  }
-
-  auto user_data = std::shared_ptr<CallbackInfo>(new CallbackInfo);
-  user_data->instance = this;
-  user_data->callback_id = callback_id;
-
-  ApplicationInformationArrayPtr app_info_array_ptr(
-    new ApplicationInformationArray());
-
-  LoggerD("Try to find...");
-  ret = app_control_foreach_app_matched(service,
-    app_control_app_matched_callback,
-    reinterpret_cast<void*>(app_info_array_ptr.get()));
-
-  if (ret == APP_CONTROL_ERROR_NONE) {
-    LoggerE("app_control_foreach_app_matched: ERROR_NONE");
-    user_data->is_success = true;
-
-    picojson::value app_infos = picojson::value(picojson::array());
-    picojson::array& app_infos_array = app_infos.get<picojson::array>();
-
-    for (int i = 0; i < app_info_array_ptr->size(); i++) {
-      ApplicationInformationPtr app_info_ptr = app_info_array_ptr->at(i);
-      app_infos_array.push_back(app_info_ptr->Value());
-    }
-
-    // ReplyAsync
-    user_data->data.insert(std::make_pair("informationArray", app_infos));
-    user_data->data.insert(std::make_pair("appControl", app_ctr_ptr->Value()));
-
-  } else if (ret == APP_CONTROL_ERROR_INVALID_PARAMETER) {
-    LoggerD("launch_request is failed. ERROR_INVALID_PARAMETER");
-    user_data->error_type = APP_ERROR_TYPE_MISMATCH;
-    snprintf(user_data->error_msg, sizeof(user_data->error_msg),
-      "launch_request is failed. INVALID_PARAMETER");
-    user_data->is_success = false;
-  } else {
-    LoggerD("launch_request is failed. UNKNOWN");
-    user_data->error_type = APP_ERROR_UNKNOWN;
-    snprintf(user_data->error_msg, sizeof(user_data->error_msg),
-      "launch_request is failed. OUT_OF_MEMORY");
-    user_data->is_success = false;
-  }
-
-  common::TaskQueue::GetInstance().Queue<CallbackInfo>(callback_thread,
-    find_callback_thread_completed, user_data);
-
-  ret = app_control_destroy(service);
-  if (ret != APP_CONTROL_ERROR_NONE) {
-    LoggerD("app_control_destroy is failed");
-  }
-
-  ReportSuccess(out);
-}
-
-void ApplicationInstance::AppMgrGetAppsContext(const picojson::value& args,
-  picojson::object& out) {
-  CHECK_EXIST(args, "callbackId", out)
-
-  int callback_id = static_cast<int>(args.get("callbackId").get<double>());
-
-  auto user_data = std::shared_ptr<CallbackInfo>(new CallbackInfo);
-  user_data->instance = this;
-  user_data->callback_id = callback_id;
-
-  common::TaskQueue::GetInstance().Queue<CallbackInfo>(
-    getappsctx_callback_thread, getappsctx_callback_thread_completed,
-    user_data);
-
-  ReportSuccess(out);
-}
-
-void ApplicationInstance::AppMgrGetAppContext(const picojson::value& args,
-  picojson::object& out) {
-  LoggerD("ENTER");
-
-  std::string context_id;
-  if (args.contains("contextId")) {
-    LoggerD("ENTER2");
-    context_id = args.get("contextId").get<std::string>();
-    LoggerD("contextId = %s", context_id.c_str());
-  } else {
-    LoggerD("contextId is null");
-  }
-  int ret = 0;
-
-  std::string cur_ctx_id = context_id;
-  int pid;
-
-  if (cur_ctx_id.empty()) {
-    pid = getpid();
-    std::stringstream sstr;
-    sstr << pid;
-    cur_ctx_id = sstr.str();
-  } else {
-    std::stringstream(context_id) >> pid;
-    if (pid <= 0) {
-      LoggerE("Given context_id is wrong");
-      ReportError(NotFoundException("Given context_id is wrong"), out);
-      return;
-    }
-  }
-
-  char *app_id = NULL;
-  LoggerD("pid: %d", pid);
-
-  ret = app_manager_get_app_id(pid, &app_id);
-  if (ret != APP_MANAGER_ERROR_NONE) {
-    // Handles error case
-    if (app_id) {
-      free(app_id);
-    }
-    switch (ret) {
-      case APP_MANAGER_ERROR_INVALID_PARAMETER:
-        LoggerE("get_app_id error : invalid parameter");
-        ReportError(NotFoundException("get_app_id error : invalid parameter"),
-          out);
-        return;
-      case APP_MANAGER_ERROR_NO_SUCH_APP:
-        LoggerE("get_app_id error : no such app");
-        ReportError(NotFoundException("get_app_id error : no such app"), out);
-        return;
-      case APP_MANAGER_ERROR_DB_FAILED:
-        LoggerE("get_app_id error : db failed");
-        ReportError(NotFoundException("get_app_id error : db failed"), out);
-        return;
-      case APP_MANAGER_ERROR_OUT_OF_MEMORY:
-        LoggerE("get_app_id error : out of memory");
-        ReportError(NotFoundException("get_app_id error : out of memory"),
-          out);
-        return;
-      default:
-        LoggerE("get_app_id known error");
-        ReportError(UnknownException("get_app_id error : unknown error"), out);
-        return;
-    }
-  }
-
-  ApplicationContextPtr app_ctx(new ApplicationContext());
-  app_ctx->set_app_id(app_id);
-  app_ctx->set_context_id(cur_ctx_id);
-
-  if (app_id)
-    free(app_id);
-
-  LoggerD("appCtx: id = %s", app_ctx->get_context_id().c_str());
-  LoggerD("appCtx: appId = %s", app_ctx->get_app_id().c_str());
-
-  ReportSuccess(picojson::value(app_ctx->Value()), out);
+  manager_.Launch(args);
 }
 
-void ApplicationInstance::AppMgrGetAppsInfo(const picojson::value& args,
-  picojson::object& out) {
-  CHECK_EXIST(args, "callbackId", out)
-
-  int callback_id = static_cast<int>(args.get("callbackId").get<double>());
-
-  auto user_data = std::shared_ptr<CallbackInfo>(new CallbackInfo);
-  user_data->instance = this;
-  user_data->callback_id = callback_id;
-
-  common::TaskQueue::GetInstance().Queue<CallbackInfo>(
-    getappsinfo_callback_thread, getappsinfo_callback_thread_completed,
-    user_data);
-
-  ReportSuccess(out);
-}
-
-void ApplicationInstance::AppMgrGetAppInfo(const picojson::value& args,
-  picojson::object& out) {
-  std::string id;
-  if (args.contains("id")) {
-    id = args.get("id").get<std::string>();
-    if (id.empty()) {
-      LoggerD("Id is null. use current app id");
-      id = app_id_;
-    }
-  } else {
-    id = app_id_;
-  }
-
-  LoggerD("app_id = %s", id.c_str());
-
-  pkgmgrinfo_appinfo_h handle;
-  int ret = pkgmgrinfo_appinfo_get_appinfo(id.c_str(), &handle);
-  if (ret != PMINFO_R_OK) {
-    LoggerE("Fail to get appInfo");
-    ReportError(NotFoundException("Given app id is not found"), out);
-    return;
-  }
-
-  ApplicationInformationPtr app_info_ptr = get_app_info(handle);
-  pkgmgrinfo_appinfo_destroy_appinfo(handle);
-
-  ReportSuccess(app_info_ptr->Value(), out);
-}
-
-void ApplicationInstance::AppMgrGetAppCerts(const picojson::value& args,
-  picojson::object& out) {
-  CHECK_PRIVILEGE_ACCESS(kPrivilegeAppManagerCertificate, &out);
-
-  std::string id;
-  if (args.contains("id")) {
-    id = args.get("id").get<std::string>();
-    if (id.empty()) {
-      LoggerD("Id is null. use current app id");
-      id = app_id_;
-    }
-  } else {
-    id = app_id_;
-  }
-
-  LoggerD("app_id = %s", id.c_str());
-
-  int ret = 0;
-  char* package = getPackageByAppId(id.c_str());
-  if (package == NULL) {
-    LoggerE("Can not get package");
-    ReportError(NotFoundException("Can not get package"), out);
-    return;
-  }
-
-  // TODO(sunggyu.choi): gPkgIdMapInited
-  package_info_h pkg_info;
-  int result = 0;
-  result = package_info_create(package, &pkg_info);
-  if (result != PACKAGE_MANAGER_ERROR_NONE) {
-    ReportError(UnknownException("Can not get package info"), out);
-    return;
-  }
-
-  ApplicationCertificateArrayPtr cert_array_ptr(
-    new ApplicationCertificateArray());
-
-  result = package_info_foreach_cert_info(pkg_info, package_certificate_cb,
-            reinterpret_cast<void*>(cert_array_ptr.get()));
-  if ((result != PACKAGE_MANAGER_ERROR_NONE) &&
-      (result != PACKAGE_MANAGER_ERROR_IO_ERROR)) {
-    ReportError(UnknownException("Can not get package cert info"), out);
-    return;
-  }
-
-  picojson::value cert_data = picojson::value(picojson::array());
-  picojson::array& cert_data_array = cert_data.get<picojson::array>();
-
-  for (int i = 0; i < cert_array_ptr->size(); i++) {
-    ApplicationCertificatePtr cert_data_ptr = cert_array_ptr->at(i);
-    cert_data_array.push_back(cert_data_ptr->Value());
-  }
-
-  ReportSuccess(cert_data, out);
-}
-
-void ApplicationInstance::AppMgrGetAppSharedURI(const picojson::value& args,
-  picojson::object& out) {
-  std::string id;
-  if (args.contains("id")) {
-    id = args.get("id").get<std::string>();
-    if (id.empty()) {
-      LoggerD("Id is null. use current app id");
-      id = app_id_;
-    }
-  } else {
-    id = app_id_;
-  }
-
-  LoggerD("app_id = %s", id.c_str());
-
-#define TIZENAPIS_APP_FILE_SCHEME      "file://"
-#define TIZENAPIS_APP_SLASH            "/"
-#define TIZENAPIS_APP_SHARED           "shared"
-
-  app_info_h handle;
-  char* pkg_name = NULL;
-
-  int ret = app_manager_get_app_info(id.c_str(), &handle);
-  if (ret != APP_ERROR_NONE) {
-    LoggerD("Fail to get appinfo");
-    ReportError(NotFoundException("Fail to get appinfo"), out);
-    return;
-  }
-
-  ret = app_info_get_package(handle, &pkg_name);
-  if ((ret != APP_ERROR_NONE) || (pkg_name == NULL)) {
-    LoggerD("Fail to get pkg_name");
-    ReportError(NotFoundException("Fail to get pkg_name"), out);
-    return;
-  }
-
-  app_info_destroy(handle);
-
-  pkgmgrinfo_pkginfo_h pkginfo_h;
-  char* root_path = NULL;
-
-  ret = pkgmgrinfo_pkginfo_get_pkginfo(pkg_name, &pkginfo_h);
-  if (ret != PMINFO_R_OK) {
-    free(pkg_name);
-    ReportError(UnknownException("Fail to get pkginfo"), out);
-    return;
-  }
-
-  ret = pkgmgrinfo_pkginfo_get_root_path(pkginfo_h, &root_path);
-  if ((ret != PMINFO_R_OK) || (root_path == NULL)) {
-     LoggerE("Fail to get root path");
-     free(pkg_name);
-     ReportError(UnknownException("Fail to get root path"), out);
-     return;
-  }
-
-  std::string shared_URI = TIZENAPIS_APP_FILE_SCHEME + std::string(root_path) +
-    TIZENAPIS_APP_SLASH + TIZENAPIS_APP_SHARED + TIZENAPIS_APP_SLASH;
-  free(pkg_name);
-
-  pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
-
-  ReportSuccess(picojson::value(shared_URI), out);
-}
-
-void ApplicationInstance::AppMgrGetAppMetaData(const picojson::value& args,
-  picojson::object& out) {
-  CHECK_PRIVILEGE_ACCESS(kPrivilegeApplicationInfo, &out);
-
-  std::string id;
-  if (args.contains("id")) {
-    id = args.get("id").get<std::string>();
-    if (id.empty()) {
-      LoggerD("Id is null. use current app id");
-      id = app_id_;
-    }
-  } else {
-    id = app_id_;
-  }
-
-  LoggerD("app_id = %s", id.c_str());
-
-  int ret = 0;
-  pkgmgrinfo_appinfo_h handle;
-  ret = pkgmgrinfo_appinfo_get_appinfo(id.c_str(), &handle);
-  if (ret != PMINFO_R_OK) {
-    ReportError(NotFoundException("Cannot find app with given app_id"), out);
-    return;
-  }
-
-  ApplicationMetaDataArrayPtr meta_data_array_ptr(
-    new ApplicationMetaDataArray());
-  ret = pkgmgrinfo_appinfo_foreach_metadata(handle, app_meta_data_cb,
-    reinterpret_cast<void*>(meta_data_array_ptr.get()));
-  if (ret != PMINFO_R_OK) {
-    LoggerE("pkgmgrinfo_appinfo_metadata_filter_foreach() failed");
-    pkgmgrinfo_appinfo_destroy_appinfo(handle);
-    ReportError(UnknownException("fail to get custom tag"), out);
-    return;
-  }
-  pkgmgrinfo_appinfo_destroy_appinfo(handle);
-
-  picojson::value meta_data = picojson::value(picojson::array());
-  picojson::array& meta_data_array = meta_data.get<picojson::array>();
-
-  for (int i = 0; i < meta_data_array_ptr->size(); i++) {
-    ApplicationMetaDataPtr meta_data_ptr = meta_data_array_ptr->at(i);
-
-    meta_data_array.push_back(meta_data_ptr->Value());
-  }
-
-  char print_buf[300] = {0};
-  snprintf(print_buf, sizeof(print_buf), meta_data.serialize().c_str());
-  LoggerD("GetAppMetaData:Result: %s", print_buf);
-
-  ReportSuccess(meta_data, out);
-}
-
-void ApplicationInstance::AppMgrAddAppInfoEventListener(
-  const picojson::value& args, picojson::object& out) {
-  CHECK_EXIST(args, "callbackId", out)
-
-  int callback_id = static_cast<int>(args.get("callbackId").get<double>());
-
-  if (manager_handle_ != NULL) {
-    LoggerD("AppListChanged callback is already registered. watch_id_ = %d",
-      watch_id_);
-    ReportError(UnknownException("Listener is already registered."), out);
-    return;
-  }
-  manager_handle_ = pkgmgr_client_new(PC_LISTENING);
-  if (manager_handle_ == NULL) {
-    ReportError(UnknownException("Error while registering listener"), out);
-    return;
-  }
-
-  pkgmgr_client_listen_status(manager_handle_, app_list_changed_cb, this);
-
-  callback_id_list_.push_back(callback_id);
-  const double ret = static_cast<double>(get_watch_id_and_increase());
-  ReportSuccess(picojson::value(ret), out);
-}
-
-void ApplicationInstance::AppMgrRemoveAppInfoEventListener(
-  const picojson::value& args, picojson::object& out) {
-  CHECK_EXIST(args, "watchId", out)
-  int watch_id = static_cast<int>(args.get("watchId").get<double>());
-
-  LoggerD("watch_id = %d", watch_id);
-
-  if (manager_handle_ == NULL) {
-    LoggerE("Listener is not added before.");
-    ReportError(UnknownException("Listener is not added before."), out);
-    return;
-  }
-
-  callback_id_list_.clear();
-
-  if (watch_id_ != watch_id) {
-    LoggerE("Invalid watch id: %d", watch_id);
-    ReportError(InvalidValuesException("Watch id is invalid."), out);
-    return;
-  }
-
-  pkgmgr_client_free(manager_handle_);
-  manager_handle_ = NULL;
-
-  ReportSuccess(out);
-}
-
-void ApplicationInstance::AppGetRequestedAppControl(
-  const picojson::value& args, picojson::object& out) {
-  std::string bundle_str =
-    common::GetCurrentExtension()->GetRuntimeVariable("encoded_bundle", 1024);
-  if (bundle_str.empty()) {
-    LoggerE("Getting encoded_bundle is failed");
-    ReportError(UnknownException("Gettng encoded_bundle is failed"), out);
-    return;
-  }
-
-  app_control_h service = NULL;
-  char* tmp_str = NULL;
-  bundle* request_bundle = bundle_decode((bundle_raw*)bundle_str.c_str(),
-    bundle_str.length());
-  if (request_bundle == NULL) {
-    ReportError(UnknownException("Decoding bundle is failed"), out);
-    return;
-  }
-
-  int ret = app_control_create_event(request_bundle, &service);
-  if (ret != APP_CONTROL_ERROR_NONE) {
-    LoggerE("Fail to create event");
-    bundle_free(request_bundle);
-    ReportError(UnknownException("Failed to create event"), out);
-    return;
-  }
-  bundle_free(request_bundle);
-
-  ApplicationControlPtr app_ctr_ptr(new ApplicationControl());
-
-  ret = app_control_get_operation(service, &tmp_str);
-  if (ret == APP_CONTROL_ERROR_NONE && tmp_str != NULL) {
-    app_ctr_ptr->set_operation(tmp_str);
-    free(tmp_str);
-    tmp_str = NULL;
-  }
-
-  ret = app_control_get_uri(service, &tmp_str);
-  if (ret == APP_CONTROL_ERROR_NONE && tmp_str != NULL) {
-    app_ctr_ptr->set_uri(tmp_str);
-    free(tmp_str);
-    tmp_str = NULL;
-  }
-
-  ret = app_control_get_mime(service, &tmp_str);
-  if (ret == APP_CONTROL_ERROR_NONE && tmp_str != NULL) {
-    app_ctr_ptr->set_mime(tmp_str);
-    free(tmp_str);
-    tmp_str = NULL;
-  }
-
-  ret = app_control_get_category(service, &tmp_str);
-  if (ret == APP_CONTROL_ERROR_NONE && tmp_str != NULL) {
-    app_ctr_ptr->set_category(tmp_str);
-    free(tmp_str);
-    tmp_str = NULL;
-  }
-
-  ApplicationControlDataArrayPtr app_ctr_data_array_ptr(
-    new ApplicationControlDataArray());
-  ret = app_control_foreach_extra_data(service,
-    app_control_extra_data_callback, app_ctr_data_array_ptr.get());
-  if (ret != APP_CONTROL_ERROR_NONE) {
-    LoggerE("app_control_foreach_extra_data fail");
-    ReportError(UnknownException("Getting extra data is failed"), out);
-    return;
-  } else {
-    app_ctr_ptr->set_data_array(*(app_ctr_data_array_ptr.get()));
-  }
-
-  RequestedApplicationControlPtr req_app_ctr_ptr(
-    new RequestedApplicationControl());
-  req_app_ctr_ptr->set_app_control(*(app_ctr_ptr.get()));
-
-  // add caller id
-  ret = app_control_get_caller(service, &tmp_str);
-  if (ret == APP_CONTROL_ERROR_NONE && tmp_str != NULL) {
-    req_app_ctr_ptr->set_caller_app_id(tmp_str);
-    free(tmp_str);
-    tmp_str = NULL;
-  } else {
-    LoggerE("Failed to get caller application ID");
-    ReportError(NotFoundException("Failed to get caller application ID"), out);
-    return;
-  }
-
-  std::pair<std::map<std::string, app_control_h>::iterator, bool> result =
-    reply_map_.insert(
-      std::map<std::string, app_control_h>::value_type(
-        req_app_ctr_ptr->get_caller_app_id(), service));
-  if (result.second) {
-    LoggerD("Adding item succeeded");
-  } else {
-    LoggerD("Adding item failed");
-  }
-
-  ReportSuccess(req_app_ctr_ptr->Value(), out);
-}
-
-void ApplicationInstance::RequestedAppControlReplyResult(
-  const picojson::value& args, picojson::object& out) {
-  ApplicationControlDataArrayPtr app_ctr_data_array_ptr(
-    new ApplicationControlDataArray());
-  std::string caller_app_id;
-  if (args.contains("callerAppId")) {
-    caller_app_id = args.get("callerAppId").get<std::string>();
-  } else {
-    ReportError(InvalidValuesException("unidentified caller"), out);
-    return;
-  }
-
-  if (args.contains("data")) {
-    if (args.get("data").is<picojson::null>() == false) {
-      picojson::array data_array = args.get("data").get<picojson::array>();
-
-      int size = data_array.size();
-      LoggerD("size = %d", size);
-      for (int i = 0; i < size; i++) {
-        ApplicationControlData* app_ctr_data = new ApplicationControlData();
-        ApplicationControlDataPtr app_ctr_data_ptr(app_ctr_data);
-
-        picojson::value& ctr_data = data_array.at(i);
-        std::string key = ctr_data.get("key").get<std::string>();
-        app_ctr_data_ptr->set_ctr_key(key);
-
-        picojson::array value_array =
-          ctr_data.get("value").get<picojson::array>();
-        int value_size = value_array.size();
-
-        LoggerD("value size = %d", value_size);
-        for (int j = 0; j < value_size; j++) {
-          picojson::value& value_data = value_array.at(i);
-          std::string value = value_data.get<std::string>();
-          LoggerD("value: %s", value.c_str());
-          app_ctr_data_ptr->add_ctr_value(value);
-        }
-        app_ctr_data_array_ptr->push_back(app_ctr_data_ptr);
-      }
-    } else {
-      LoggerD("data is null.");
-    }
-  }
-
-  app_control_h reply;
-  app_control_create(&reply);
-
-  if (!app_ctr_data_array_ptr->empty()) {
-    const char** arr = NULL;
-
-    int size = app_ctr_data_array_ptr->size();
-    LoggerD("size: %d", size);
-    for (size_t i = 0; i < size; i++) {
-      std::vector<std::string> value_array =
-        app_ctr_data_array_ptr->at(i)->get_ctr_value();
-      arr = (const char**) calloc (sizeof(char*), value_array.size());
-
-      if (arr != NULL) {
-        for (size_t j = 0; j < value_array.size(); j++) {
-          arr[j] = value_array.at(j).c_str();
-          LoggerD("[index: %d][value: %s]", j, arr[j]);
-        }
-      }
-      const char* key = app_ctr_data_array_ptr->at(i)->get_ctr_key().c_str();
-      LoggerD("key: %s", key);
-      app_control_add_extra_data_array(reply, key, arr, value_array.size());
-      if (arr) {
-        free(arr);
-      }
-    }
-  } else {
-    LoggerE("[replyResult] app_ctr_data_array_ptr is empty");
-  }
-
-  std::map<std::string, app_control_h>::iterator it =
-    reply_map_.find(caller_app_id);
-  if (it == reply_map_.end()) {
-    LoggerE("caller handle is not found");
-    app_control_destroy(reply);
-    ReportError(NotFoundException("caller handle is not found"), out);
-    return;
-  }
-
-  bool running = false;
-  int ret = app_manager_is_running(caller_app_id.c_str(), &running);
-  if ((ret != APP_MANAGER_ERROR_NONE) || !running) {
-    LoggerE("caller is not running");
-    app_control_destroy(reply);
-    ReportError(NotFoundException("Cannot find caller"), out);
-    return;
-  }
-
-  ret = app_control_reply_to_launch_request(reply, it->second,
-    APP_CONTROL_RESULT_SUCCEEDED);
-  if (ret != APP_CONTROL_ERROR_NONE) {
-    LoggerE("Cannot find caller");
-    app_control_destroy(reply);
-    ReportError(NotFoundException("Cannot find caller"), out);
-    return;
-  }
-
-  reply_map_.erase(it);
-  app_control_destroy(reply);
-
-  ReportSuccess(out);
-}
-
-void ApplicationInstance::RequestedAppControlReplyFailure(
-  const picojson::value& args, picojson::object& out) {
-  std::string caller_app_id;
-  if (args.contains("callerAppId")) {
-    caller_app_id = args.get("callerAppId").get<std::string>();
-  } else {
-    ReportError(InvalidValuesException("unidentified caller"), out);
-    return;
-  }
-
-  app_control_h reply;
-  app_control_create(&reply);
-
-  std::map<std::string, app_control_h>::iterator it =
-    reply_map_.find(caller_app_id);
-  if (it == reply_map_.end()) {
-    LoggerE("caller handle is not found");
-    ReportError(NotFoundException("caller handle is not found"), out);
-    return;
-  }
-
-  bool running = false;
-  int ret = app_manager_is_running(caller_app_id.c_str(), &running);
-  if ((ret != APP_MANAGER_ERROR_NONE) || !running) {
-    LoggerE("caller is not running");
-    app_control_destroy(reply);
-    ReportError(NotFoundException("Cannot find caller"), out);
-    return;
-  }
-
-  ret = app_control_reply_to_launch_request(reply, it->second,
-    APP_CONTROL_RESULT_FAILED);
-  if (ret != APP_CONTROL_ERROR_NONE) {
-    LoggerE("Cannot find caller");
-    app_control_destroy(reply);
-    ReportError(NotFoundException("Cannot find caller"), out);
-    return;
-  }
-
-  reply_map_.erase(it);
-  app_control_destroy(reply);
-
-  ReportSuccess(out);
-}
-
-ApplicationInformationPtr ApplicationInstance::GetAppInfo(
-  const std::string app_id) {
-  LoggerD("app_id: %s", app_id.c_str());
-
-  pkgmgrinfo_appinfo_h handle;
-  int ret = pkgmgrinfo_appinfo_get_appinfo(app_id.c_str(), &handle);
-  if (ret != PMINFO_R_OK) {
-    LoggerE("Fail to get appInfo");
-    ApplicationInformationPtr app_info_ptr(new ApplicationInformation());
-    return app_info_ptr;
-  }
+void ApplicationInstance::LaunchAppControl(const picojson::value& args, picojson::object& out) {
+  LoggerD("Entered");
 
-  ApplicationInformationPtr app_info_ptr = get_app_info(handle);
-  pkgmgrinfo_appinfo_destroy_appinfo(handle);
+  CHECK_PRIVILEGE_ACCESS(kPrivilegeApplicationLaunch, &out);
 
-  return app_info_ptr;
+  manager_.LaunchAppControl(args);
 }
 
-int ApplicationInstance::app_list_changed_cb(int id, const char *type,
-  const char *package, const char *key, const char *val, const void *msg,
-  void *data) {
-  static app_info_event_e event_type;
-
-  LoggerD("ENTERED");
-
-  // pre-process
-  if (!strcasecmp(key, "start")) {
-    if (!strcasecmp(val, "install")) {
-      LoggerD("start: install");
-      event_type = APP_INFO_EVENT_INSTALLED;
-    } else if (!strcasecmp(val, "uninstall")) {
-      // After uninstallation, we cannot get app ids from package name.
-      // So, we have to store app ids which is included to target package.
-      LoggerD("start: uninstall");
-      package_info_h package_info;
-
-      int ret = package_info_create(package, &package_info);
-      if (ret != PACKAGE_MANAGER_ERROR_NONE) {
-        LoggerE("Cannot create package info");
-      }
-
-      ret = package_info_foreach_app_from_package(package_info,
-        PACKAGE_INFO_ALLAPP, app_callback, data);
-      if (ret != PACKAGE_MANAGER_ERROR_NONE) {
-        LoggerE("failed while getting appids");
-      }
-      ret = package_info_destroy(package_info);
-      if (ret != PACKAGE_MANAGER_ERROR_NONE) {
-        LoggerE("Cannot destroy package info");
-      }
-      event_type = APP_INFO_EVENT_UNINSTALLED;
-    } else if (!strcasecmp(val, "update")) {
-      LoggerD("start: update");
-      event_type = APP_INFO_EVENT_UPDATED;
-    }
-  // post-process
-  } else if (!strcasecmp(key, "end") && !strcasecmp(val, "ok")) {
-    if (event_type >= 0) {
-      if (data != NULL) {
-        LoggerD("end & ok is called: package = %s", package);
-        // ApplicationInstance* app_instance = (ApplicationInstance*)data;
-        ApplicationInstance* app_instance =
-          reinterpret_cast<ApplicationInstance*>(data);
-        app_instance->ReplyAppListChangedCallback(event_type, package, data);
-      }
-    }
-  }
+void ApplicationInstance::FindAppControl(const picojson::value& args, picojson::object& out) {
+  LoggerD("Entered");
 
-  return APP_MANAGER_ERROR_NONE;
+  manager_.FindAppControl(args);
 }
 
-bool ApplicationInstance::app_callback(
-  package_info_app_component_type_e comp_type, const char *app_id,
-  void *user_data) {
-  LoggerD("ENTERED");
-
-  if (app_id == NULL) {
-    LoggerE("Callback is called. but no package name is passed");
-    return true;
-  }
-
-  if (user_data == NULL) {
-    LoggerE("user data is not exist. skip this request");
-    return true;
-  }
-
-  LoggerD("app_id = %s", app_id);
-  ApplicationInstance* app_instance =
-    reinterpret_cast<ApplicationInstance*>(user_data);
-  app_instance->app_list_.push_back(app_id);
+void ApplicationInstance::GetAppsContext(const picojson::value& args, picojson::object& out) {
+  LoggerD("Entered");
 
-  return true;
+  manager_.GetAppsContext(args);
 }
 
-void ApplicationInstance::ReplyAppListChangedCallback(
-  app_info_event_e event_type, const char* pkg_id, void* user_data) {
-  LoggerD("ENTERED");
-
-  ApplicationInstance* app_instance =
-    reinterpret_cast<ApplicationInstance*>(user_data);
-
-  if (event_type == APP_INFO_EVENT_UNINSTALLED) {
-    for (size_t i = 0; i < app_list_.size(); i++) {
-      // onuninstalled
-      LoggerD("onuninstalled: %d of %d", i, app_list_.size());
-      std::string app_id = app_list_.at(i);
-
-      for (size_t j = 0; j < callback_id_list_.size(); j++) {
-        int callback_id = callback_id_list_.at(j);
-        LoggerD("%d th callback_id(%d) of %d", j, callback_id,
-          callback_id_list_.size());
-        picojson::object data;
-        data.insert(std::make_pair("type", picojson::value("onuninstalled")));
-        data.insert(std::make_pair("id", picojson::value(app_id)));
-        ReplyAsync(this, callback_id, true, &data, 0, NULL);
-      }
-    }
-  } else {
-    package_info_h package_info;
-
-    int ret = package_info_create(pkg_id, &package_info);
-    if (ret != PACKAGE_MANAGER_ERROR_NONE) {
-      LoggerE("Cannot create package info");
-      return;
-    }
-
-    // app_callback is called immediately
-    ret = package_info_foreach_app_from_package(package_info,
-      PACKAGE_INFO_ALLAPP, app_callback, user_data);
-    if (ret != PACKAGE_MANAGER_ERROR_NONE) {
-      LoggerE("failed while getting appids");
-      package_info_destroy(package_info);
-      return;
-    }
-
-    ret = package_info_destroy(package_info);
-    if (ret != PACKAGE_MANAGER_ERROR_NONE) {
-      LoggerE("Cannot destroy package info");
-    }
-
-    for (size_t i = 0; i < app_list_.size(); i++) {
-      switch (event_type) {
-        case APP_INFO_EVENT_INSTALLED:
-          {
-            // oninstalled
-            LoggerD("oninstalled: %d of %d", i, app_list_.size());
-            std::string app_id = app_list_.at(i);
-
-            ApplicationInformationPtr app_info_ptr = GetAppInfo(app_id);
-
-            for (size_t j = 0; j < callback_id_list_.size(); j++) {
-              int callback_id = callback_id_list_.at(j);
-              LoggerD("%d th callback_id(%d) of %d", j, callback_id,
-                callback_id_list_.size());
-              picojson::object data;
-              data.insert(std::make_pair("type",
-                picojson::value("oninstalled")));
-              data.insert(std::make_pair("info",
-                picojson::value(app_info_ptr->Value())));
-              ReplyAsync(this, callback_id, true, &data, 0, NULL);
-            }
-          }
-          break;
-        case APP_INFO_EVENT_UPDATED:
-          {
-            // onupdated
-            LoggerD("onupdated: %d of %d", i, app_list_.size());
-            std::string app_id = app_list_.at(i);
-
-            ApplicationInformationPtr app_info_ptr = GetAppInfo(app_id);
-
-            for (size_t j = 0; j < callback_id_list_.size(); j++) {
-              int callback_id = callback_id_list_.at(j);
-              LoggerD("%d th callback_id(%d) of %d", j, callback_id,
-                callback_id_list_.size());
-              picojson::object data;
-              data.insert(std::make_pair("type",
-                picojson::value("onupdated")));
-              data.insert(std::make_pair("info",
-                picojson::value(app_info_ptr->Value())));
-              ReplyAsync(this, callback_id, true, &data, 0, NULL);
-            }
-          }
-          break;
-        default:
-          LoggerE("app_manager listener gave wrong event_type");
-          break;
-      }
-    }
-  }
-
-  // clean-up applist
-  app_list_.clear();
-}
+void ApplicationInstance::GetAppsInfo(const picojson::value& args, picojson::object& out) {
+  LoggerD("Entered");
 
-int ApplicationInstance::get_watch_id_and_increase() {
-  return ++watch_id_;
+  manager_.GetAppsInfo(args);
 }
-#undef CHECK_EXIST
 
 }  // namespace application
 }  // namespace extension
index c1875e16505d080153d8271f8a952504f9dddca6..61d12c16ba9aaea5a2e53853fb11ed902276e03a 100644 (file)
@@ -5,86 +5,43 @@
 #ifndef SRC_APPLICATION_APPLICATION_INSTANCE_H_
 #define SRC_APPLICATION_APPLICATION_INSTANCE_H_
 
-// to handle app-control
-#include <bundle.h>
-#include <app.h>
-#include <app_control.h>
-
-// to get package name bye appid
-#include <app_manager.h>
-
-// to get cert info from package
-#include <package-manager.h>
-#include <package_manager.h>
-
 #include <string>
-#include <list>
-#include <vector>
-#include <map>
 
 #include "common/extension.h"
+#include "application/application_manager.h"
 #include "application/application.h"
-#include "application/application_context.h"
-#include "application/application_metadata.h"
-#include "application/application_certificate.h"
-#include "application/application_control.h"
 #include "application/requested_application_control.h"
 
 namespace extension {
 namespace application {
 
-class ApplicationInstance
-  : public common::ParsedInstance {
+class ApplicationInstance: public common::ParsedInstance {
  public:
-  explicit ApplicationInstance(const std::string& app_id);
+  ApplicationInstance(const std::string& app_id);
   virtual ~ApplicationInstance();
-
  private:
-  void AppMgrGetCurrentApplication(const picojson::value& args,
-    picojson::object& out);
-  void AppMgrKill(const picojson::value& args, picojson::object& out);
-  void AppMgrLaunch(const picojson::value& args, picojson::object& out);
-  void AppMgrLaunchAppControl(const picojson::value& args,
-    picojson::object& out);
-  void AppMgrFindAppControl(const picojson::value& args,
-    picojson::object& out);
-  void AppMgrGetAppsContext(const picojson::value& args,
-    picojson::object& out);
-  void AppMgrGetAppContext(const picojson::value& args, picojson::object& out);
-  void AppMgrGetAppsInfo(const picojson::value& args, picojson::object& out);
-  void AppMgrGetAppInfo(const picojson::value& args, picojson::object& out);
-  void AppMgrGetAppCerts(const picojson::value& args, picojson::object& out);
-  void AppMgrGetAppSharedURI(const picojson::value& args,
-    picojson::object& out);
-  void AppMgrGetAppMetaData(const picojson::value& args,
-    picojson::object& out);
-  void AppMgrAddAppInfoEventListener(const picojson::value& args,
-    picojson::object& out);
-  void AppMgrRemoveAppInfoEventListener(const picojson::value& args,
-    picojson::object& out);
-  void AppGetRequestedAppControl(const picojson::value& args,
-    picojson::object& out);
-  void RequestedAppControlReplyResult(const picojson::value& args,
-    picojson::object& out);
-  void RequestedAppControlReplyFailure(const picojson::value& args,
-    picojson::object& out);
-
-  ApplicationInformationPtr GetAppInfo(const std::string app_id);
-  static bool app_callback(package_info_app_component_type_e comp_type,
-    const char *app_id, void *user_data);
-  static int app_list_changed_cb(int id, const char *type, const char *package,
-    const char *key, const char *val, const void *msg, void *data);
-  void ReplyAppListChangedCallback(app_info_event_e event_type,
-    const char *pkg_id, void *user_data);
-
-  int get_watch_id_and_increase();
-
+  void GetCurrentApplication(const picojson::value& args, picojson::object& out);
+  void GetAppContext(const picojson::value& args, picojson::object& out);
+  void GetAppInfo(const picojson::value& args, picojson::object& out);
+  void GetAppCerts(const picojson::value& args, picojson::object& out);
+  void GetAppSharedURI(const picojson::value& args, picojson::object& out);
+  void GetAppMetaData(const picojson::value& args, picojson::object& out);
+  void AddAppInfoEventListener(const picojson::value& args, picojson::object& out);
+  void RemoveAppInfoEventListener(const picojson::value& args, picojson::object& out);
+  void GetRequestedAppControl(const picojson::value& args, picojson::object& out);
+  void ReplyResult(const picojson::value& args, picojson::object& out);
+  void ReplyFailure(const picojson::value& args, picojson::object& out);
+  void GetSize(const picojson::value& args, picojson::object& out);
+  void Kill(const picojson::value& args, picojson::object& out);
+  void Launch(const picojson::value& args, picojson::object& out);
+  void LaunchAppControl(const picojson::value& args, picojson::object& out);
+  void FindAppControl(const picojson::value& args, picojson::object& out);
+  void GetAppsContext(const picojson::value& args, picojson::object& out);
+  void GetAppsInfo(const picojson::value& args, picojson::object& out);
+
+  ApplicationManager manager_;
+  Application current_application_;
   std::string app_id_;
-  pkgmgr_client* manager_handle_;
-  std::vector<int> callback_id_list_;
-  int watch_id_;
-  std::vector<std::string> app_list_;
-  std::map<std::string, app_control_h> reply_map_;
 };
 
 }  // namespace application
diff --git a/src/application/application_manager.cc b/src/application/application_manager.cc
new file mode 100644 (file)
index 0000000..bdc0c33
--- /dev/null
@@ -0,0 +1,1304 @@
+// Copyright 2015 Samsung Electronics Co, Ltd. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "application_manager.h"
+
+#include <type_traits>
+#include <unistd.h>
+
+#include <app_info.h>
+#include <app_manager.h>
+#include <aul.h>
+#include <package_manager.h>
+#include <pkgmgr-info.h>
+
+#include "application/application_instance.h"
+#include "application/application_utils.h"
+#include "common/current_application.h"
+#include "common/logger.h"
+#include "common/platform_result.h"
+#include "common/task-queue.h"
+
+using namespace common;
+using namespace tools;
+
+namespace extension {
+namespace application {
+
+namespace {
+const std::string kTizenApisFileScheme = "file://";
+const std::string kTizenApisAppSlash = "/";
+const std::string kTizenApisAppShared = "shared";
+
+const char* kStartKey = "start";
+const char* kEndKey = "end";
+const char* kOkValue = "ok";
+const char* kInstallEvent = "install";
+const char* kUpdateEvent = "update";
+const char* kUninstallEvent = "uninstall";
+
+const std::string kAction = "action";
+const std::string kCallbackId = "callbackId";
+const std::string kOnInstalled = "oninstalled";
+const std::string kOnUpdated = "onupdated";
+const std::string kOnUninstalled = "onuninstalled";
+const std::string kData = "data";
+}
+
+ApplicationManager::ApplicationManager(ApplicationInstance& instance) :
+  instance_(instance),
+  pkgmgr_client_handle_(nullptr) {
+}
+
+ApplicationManager::~ApplicationManager() {
+  if (pkgmgr_client_handle_) {
+    StopAppInfoEventListener();
+  }
+}
+
+void ApplicationManager::GetCurrentApplication(const std::string& app_id,
+                                                         picojson::object* out) {
+  LoggerD("Entered");
+
+  // obtain handle to application info
+  pkgmgrinfo_appinfo_h handle;
+  int ret = pkgmgrinfo_appinfo_get_appinfo(app_id.c_str(), &handle);
+  if (PMINFO_R_OK != ret) {
+    LoggerE("Failed to get app info.");
+    ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to get app info."), out);
+    return;
+  }
+
+  picojson::value app_info = picojson::value(picojson::object());
+  picojson::object& app_info_obj = app_info.get<picojson::object>();
+
+  ApplicationUtils::CreateApplicationInformation(handle, &app_info_obj);
+  pkgmgrinfo_appinfo_destroy_appinfo(handle);
+
+  picojson::value result = picojson::value(picojson::object());
+  picojson::object& result_obj = result.get<picojson::object>();
+
+  result_obj.insert(std::make_pair(
+      "contextId", picojson::value(std::to_string(CurrentApplication::GetInstance().GetProcessId()))));
+  result_obj.insert(std::make_pair("appInfo", app_info));
+
+  ReportSuccess(result, *out);
+}
+
+class TerminateHandler {
+ public:
+  TerminateHandler(int callback_id, ApplicationInstance* app_instance) :
+    callback_handle_(callback_id),
+    app_instance_(app_instance),
+    pid_(-1),
+    timeout_id_(0) {
+  }
+
+  void set_pid(pid_t pid) {
+    pid_ = pid;
+  }
+
+  pid_t pid() const {
+    return pid_;
+  }
+
+  void Invoke(const std::shared_ptr<picojson::value>& response) {
+    LoggerD("Entered");
+
+    if (timeout_id_ > 0) {
+      // cancel terminate callback
+      g_source_remove(timeout_id_);
+      timeout_id_ = 0;
+    }
+
+    ApplicationInstance* app_instance = this->app_instance_;
+    int callback_id = this->callback_handle_;
+    TaskQueue::GetInstance().Async<picojson::value>([callback_id, app_instance](
+        const std::shared_ptr<picojson::value>& response) {
+      picojson::object& obj = response->get<picojson::object>();
+      obj.insert(std::make_pair(kCallbackId, picojson::value(static_cast<double>(callback_id))));
+      app_instance->PostMessage(response->serialize().c_str());
+    }, response);
+  }
+
+  void LaunchCheckTerminate() {
+    LoggerD("Entered");
+    timeout_id_ = g_timeout_add(3000, CheckTerminate, this);
+    LoggerD("END");
+  }
+
+ private:
+  static gboolean CheckTerminate(gpointer user_data) {
+    LoggerD("Entered");
+    TerminateHandler* that = static_cast<TerminateHandler*>(user_data);
+    LoggerD("PID: %d", that->pid_);
+
+    // we're canceling the callback by returning false, no need for Invoke() to do that again
+    that->timeout_id_ = 0;
+
+    char* app_id = nullptr;
+    std::shared_ptr<picojson::value> response{new picojson::value(picojson::object())};
+
+    LoggerD("checking if application is still alive");
+    if (app_manager_get_app_id(that->pid_, &app_id) == APP_MANAGER_ERROR_NONE) {
+        LoggerD("application is alive - failure");
+        free(app_id);
+        // context is still alive, report error
+        ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to kill application."),
+                    &response->get<picojson::object>());
+    } else {
+        LoggerD("application is dead - success");
+        ReportSuccess(response->get<picojson::object>());
+    }
+
+    that->Invoke(response);
+    delete that;
+
+    return false;
+  }
+
+  int callback_handle_;
+  pid_t pid_;
+  guint timeout_id_;
+  ApplicationInstance* app_instance_;
+};
+
+#define CHECK_RESULT(result, response, handler) \
+  if (result.IsError()) { \
+    ReportError(result, &response->get<picojson::object>()); \
+    handler->Invoke(response); \
+    delete handler; \
+    return; \
+  }
+
+void ApplicationManager::AsyncResponse(PlatformResult& result,
+                                       std::shared_ptr<picojson::value>* response) {
+
+  ReportError(result, &(*response)->get<picojson::object>());
+
+  TaskQueue::GetInstance().Async<picojson::value>([this](
+      const std::shared_ptr<picojson::value>& response) {
+        this->instance_.PostMessage(response->serialize().c_str());
+      }, *response);
+}
+
+void ApplicationManager::Kill(const picojson::value& args) {
+  LoggerD("Entered");
+
+  PlatformResult result = PlatformResult(ErrorCode::NO_ERROR);
+
+  int callback_id = -1;
+  const auto& callback = args.get(kCallbackId);
+  if (callback.is<double>()) {
+    callback_id = static_cast<int>(callback.get<double>());
+  }
+
+  const auto& context = args.get("contextId");
+  if (!context.is<std::string>()) {
+    LoggerE("Invalid parameter passed.");
+    result = PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter passed.");
+  }
+
+  const std::string& context_id = context.get<std::string>();
+
+  if (context_id.empty() && result.IsSuccess()) {
+    LoggerE("Context ID is empty.");
+    result = PlatformResult(ErrorCode::NOT_FOUND_ERR, "Context ID is empty.");
+  }
+
+  std::shared_ptr<picojson::value> response(new picojson::value(picojson::object()));
+  picojson::object& obj = response->get<picojson::object>();
+  obj.insert(std::make_pair(kCallbackId, picojson::value(static_cast<double>(callback_id))));
+
+  if (result.IsError()) {
+    AsyncResponse(result, &response);
+    return;
+  }
+
+  auto kill = [this, callback_id, context_id]() -> void {
+    LoggerD("Entered Kill async");
+
+    std::shared_ptr<picojson::value> response =
+        std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
+
+    TerminateHandler* handler = new TerminateHandler(callback_id, &this->instance_);
+    PlatformResult result = PlatformResult(ErrorCode::NO_ERROR);
+
+    pid_t pid = -1;
+    try {
+      pid = std::stoi(context_id);
+    } catch (...) {
+      LoggerE("Failed to convert string to int");
+      result = PlatformResult(ErrorCode::NOT_FOUND_ERR, "Failed to convert string to int.");
+      CHECK_RESULT(result, response, handler)
+    }
+
+    if (pid <= 0) {
+      LoggerE("Context ID cannot be negative value");
+      result = PlatformResult(ErrorCode::NOT_FOUND_ERR, "Context ID cannot be negative value.");
+      CHECK_RESULT(result, response, handler)
+    }
+
+    // if kill request comes for current context, throw InvalidValuesException
+    if (CurrentApplication::GetInstance().GetProcessId() == pid) {
+      LoggerE("Cannot kill current application.");
+      result = PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Cannot kill current application.");
+      CHECK_RESULT(result, response, handler)
+    }
+
+    LoggerD("Kill async, pid: %d", pid);
+
+    char* app_id = nullptr;
+    int ret = app_manager_get_app_id(pid, &app_id);
+    // automatically release the memory
+    std::unique_ptr<char, void(*)(void*)> app_id_ptr(app_id, &std::free);
+
+    if (APP_MANAGER_ERROR_NONE != ret) {
+      LoggerE("Failed to get application ID, error: %d", ret);
+      result = PlatformResult(ErrorCode::NOT_FOUND_ERR, "Failed to get application ID.");
+      CHECK_RESULT(result, response, handler)
+    }
+
+    LoggerD("Kill async, app ID: %s", app_id);
+
+    // acquire application context
+    app_context_h app_context = nullptr;
+
+    ret = app_manager_get_app_context(app_id, &app_context);
+    std::unique_ptr<std::remove_pointer<app_context_h>::type, int(*)(app_context_h)>
+    app_context_ptr(app_context, &app_context_destroy); // automatically release the memory
+
+    if (APP_MANAGER_ERROR_NONE != ret) {
+      LoggerE("Failed to get application context handle");
+      result = PlatformResult(ErrorCode::NOT_FOUND_ERR, "Failed to get application ID.");
+      CHECK_RESULT(result, response, handler)
+    }
+
+    auto terminate_callback = [](app_context_h app_context,
+        app_context_event_e event,
+        void* user_data) {
+      LoggerD("terminate_callback: %d", event);
+
+      if (APP_CONTEXT_EVENT_TERMINATED != event) {
+        LoggerD("ignoring event");
+        return;
+      }
+
+      int pid = 0;
+      int ret = app_context_get_pid(app_context, &pid);
+
+      if (APP_MANAGER_ERROR_NONE != ret) {
+        LoggerE("Failed to get pid of terminated app (%d)", ret);
+        return;
+      }
+
+      TerminateHandler* handler = static_cast<TerminateHandler*>(user_data);
+
+      LoggerD("Expected PID: %d, got: %d", handler->pid(), pid);
+
+      if (handler->pid() == pid) {
+        std::shared_ptr<picojson::value> response =
+            std::shared_ptr<picojson::value>(new picojson::value(picojson::object()));
+        ReportSuccess(response->get<picojson::object>());
+        handler->Invoke(response);
+        delete handler;
+      }
+    };
+
+    LoggerD("Kill async, setting callback");
+    handler->set_pid(pid);
+    ret = app_manager_set_app_context_event_cb(terminate_callback, handler);
+
+    if (APP_MANAGER_ERROR_NONE != ret) {
+      LoggerE("Error while registering app context event (%d)", ret);
+      result = PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to register termination callback.");
+      CHECK_RESULT(result, response, handler)
+    }
+
+    // due to platform issue, sometimes termination event is not reported to callback
+    // registered with app_manager_set_app_context_event_cb()
+    // this is a workaround, it should be removed when issue is solved
+    handler->LaunchCheckTerminate();
+
+    LoggerD("Kill async, KILL!!!!!!!!!");
+
+    // terminate application
+    ret = app_manager_terminate_app(app_context);
+
+    if (APP_MANAGER_ERROR_NONE != ret) {
+      LoggerE("Failed to terminate application.");
+      result = PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to terminate application.");
+      CHECK_RESULT(result, response, handler)
+    }
+
+    LoggerD("Kill async, end, waiting for notification");
+  };
+
+  TaskQueue::GetInstance().Queue(kill);
+}
+
+void ApplicationManager::Launch(const picojson::value& args) {
+  LoggerD("Entered");
+
+  int callback_id = -1;
+  const auto& callback = args.get(kCallbackId);
+  if (callback.is<double>()) {
+    callback_id = static_cast<int>(callback.get<double>());
+  }
+
+  std::shared_ptr<picojson::value> response(new picojson::value(picojson::object()));
+  picojson::object& obj = response->get<picojson::object>();
+  obj.insert(std::make_pair(kCallbackId, picojson::value(static_cast<double>(callback_id))));
+
+  const auto& app_id = args.get("id");
+  if (!app_id.is<std::string>()) {
+    LoggerE("Invalid parameter passed.");
+    PlatformResult ret = PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter passed.");
+    AsyncResponse(ret, &response);
+    return;
+  }
+  const std::string& id = app_id.get<std::string>();
+
+  auto launch = [id](const std::shared_ptr<picojson::value>& response) -> void {
+    PlatformResult result = PlatformResult(ErrorCode::NO_ERROR);
+    const char* app_id = id.c_str();
+    const int retry_count = 3;
+
+    int retry = 0;
+    int ret = 0;
+
+    while (retry < retry_count) {
+      ret = aul_open_app(app_id);
+
+      if (ret >= 0) {
+        break;
+      }
+
+      // delay 300ms for each retry
+      usleep(300 * 1000);
+      ++retry;
+
+      LoggerD("Retry launch request: %d", retry);
+    }
+
+    if (ret < 0) {
+      result = PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error has occurred.");
+
+      switch (ret) {
+        case AUL_R_EINVAL:
+        case AUL_R_ERROR:
+          LoggerE("aul_open_app returns Not Found error");
+          result = PlatformResult(ErrorCode::NOT_FOUND_ERR, "Launchpad returns not found error.");
+          break;
+
+        case AUL_R_ECOMM:
+          LoggerE("aul_open_app returns internal IPC error");
+          result = PlatformResult(ErrorCode::UNKNOWN_ERR, "Internal IPC error has occurred.");
+          break;
+      }
+
+      ReportError(result, &response->get<picojson::object>());
+    } else {
+      LoggerD("Launch request success");
+      ReportSuccess(response->get<picojson::object>());
+    }
+  };
+
+  auto launch_response = [this](const std::shared_ptr<picojson::value>& response) -> void {
+    this->instance_.PostMessage(response->serialize().c_str());
+  };
+
+  TaskQueue::GetInstance().Queue<picojson::value>(launch, launch_response, response);
+}
+
+void ApplicationManager::LaunchAppControl(const picojson::value& args) {
+  LoggerD("Entered");
+
+  int callback_id = -1;
+  const auto& callback = args.get(kCallbackId);
+  if (callback.is<double>()) {
+    callback_id = static_cast<int>(callback.get<double>());
+  }
+
+  std::shared_ptr<picojson::value> response(new picojson::value(picojson::object()));
+  picojson::object& response_obj = response->get<picojson::object>();
+  response_obj.insert(
+      std::make_pair(kCallbackId, picojson::value(static_cast<double>(callback_id))));
+
+  PlatformResult result = PlatformResult(ErrorCode::NO_ERROR);
+  const auto& control = args.get("appControl");
+  if (!control.is<picojson::object>()) {
+    LoggerE("Invalid parameter passed.");
+    result = PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter passed.");
+    AsyncResponse(result, &response);
+    return;
+  }
+  const picojson::object& app_control_obj = control.get<picojson::object>();
+
+  std::string launch_mode_str;
+  const auto& launch_mode = args.get("launchMode");
+  if (launch_mode.is<std::string>()) {
+    launch_mode_str = launch_mode.get<std::string>();
+  }
+
+  app_control_h app_control;
+  result = ApplicationUtils::ApplicationControlToService(app_control_obj, &app_control);
+  std::shared_ptr<std::remove_pointer<app_control_h>::type>
+  app_control_ptr(app_control, &app_control_destroy); // automatically release the memory
+
+  if (result.IsError()) {
+    LoggerE("Application control to service failed.");
+    AsyncResponse(result, &response);
+    return;
+  }
+
+  std::string app_id;
+  const auto& id = args.get("id");
+  if (id.is<std::string>()) {
+    app_id = id.get<std::string>();
+  }
+
+  std::string reply_callback;
+  const auto& reply = args.get("replyCallback");
+  if (reply.is<std::string>()) {
+    reply_callback = reply.get<std::string>();
+  }
+
+  auto launch = [this, app_control_ptr, app_id, launch_mode_str, reply_callback](
+      const std::shared_ptr<picojson::value>& response) -> void {
+    LoggerD("Entered");
+
+    if (!app_id.empty()) {
+      LoggerD("app_id: %s", app_id.c_str());
+
+      app_control_set_app_id(app_control_ptr.get(), app_id.c_str());
+
+      char* resolved_app_id = nullptr;
+
+      // application ID can be aliased, read it again to get the real value
+      app_control_get_app_id(app_control_ptr.get(), &resolved_app_id);
+      // automatically release the memory
+      std::unique_ptr<char, void(*)(void*)> resolved_app_id_ptr(resolved_app_id, std::free);
+
+      // Check if application exists
+      app_info_h info_h = nullptr;
+
+      int ret = app_manager_get_app_info(resolved_app_id, &info_h);
+      std::unique_ptr<std::remove_pointer<app_info_h>::type, int(*)(app_info_h)>
+      info_h_ptr(info_h, &app_info_destroy); // automatically release the memory
+
+      if (APP_MANAGER_ERROR_NONE != ret) {
+        LoggerE("Specified application does not exist");
+        ReportError(PlatformResult(ErrorCode::NOT_FOUND_ERR, "No matched application found."),
+                    &response->get<picojson::object>());
+        return;
+      }
+    }
+
+    if (!launch_mode_str.empty()) {
+      app_control_launch_mode_e launch_mode;
+
+      if ("SINGLE" == launch_mode_str) {
+        launch_mode = APP_CONTROL_LAUNCH_MODE_SINGLE;
+      } else if ("GROUP" == launch_mode_str) {
+        launch_mode = APP_CONTROL_LAUNCH_MODE_GROUP;
+      } else {
+        LoggerE("Invalid parameter passed.");
+        ReportError(PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter passed."),
+                    &response->get<picojson::object>());
+        return;
+      }
+
+      int ret = app_control_set_launch_mode(app_control_ptr.get(), launch_mode);
+      if (APP_CONTROL_ERROR_NONE != ret) {
+        LoggerE("Setting launch mode failed.");
+        ReportError(PlatformResult(ErrorCode::NOT_FOUND_ERR, "Setting launch mode failed."),
+                    &response->get<picojson::object>());
+        return;
+      }
+    }
+
+    app_control_reply_cb callback = nullptr;
+    struct ReplayCallbackData {
+      ApplicationInstance* app_instance;
+      std::string reply_callback;
+    };
+
+    ReplayCallbackData* user_data = nullptr;
+
+    if (!reply_callback.empty()) {
+      user_data = new ReplayCallbackData();
+      user_data->app_instance = &this->instance_;
+      user_data->reply_callback = reply_callback;
+
+      callback = [](app_control_h request,
+          app_control_h reply, app_control_result_e result, void* user_data) {
+        LoggerD("send_launch_request callback");
+
+        picojson::value return_value = picojson::value(picojson::object());
+        picojson::object& return_value_obj = return_value.get<picojson::object>();
+        ReplayCallbackData* reply_callback = static_cast<ReplayCallbackData*>(user_data);
+
+        if (APP_CONTROL_RESULT_SUCCEEDED == result) {
+          const std::string data = "data";
+          return_value_obj.insert(std::make_pair(data, picojson::value(picojson::array())));
+          if (!ApplicationUtils::ServiceToApplicationControlDataArray(
+              reply, &return_value_obj.find(data)->second.get<picojson::array>())) {
+            return_value_obj.erase(data);
+          }
+          ReportSuccess(return_value_obj);
+        } else {
+          ReportError(return_value_obj);
+        }
+
+        return_value_obj.insert(
+            std::make_pair("listenerId", picojson::value(reply_callback->reply_callback)));
+        reply_callback->app_instance->PostMessage(return_value.serialize().c_str());
+        delete reply_callback;
+      };
+    }
+
+    const int retry_count = 3;
+
+    int retry = 0;
+    int ret = 0;
+
+    while (retry < retry_count) {
+      ret = app_control_send_launch_request(app_control_ptr.get(), callback, user_data);
+
+      if (APP_CONTROL_ERROR_NONE == ret) {
+        break;
+      }
+
+      // delay 300ms for each retry
+      usleep(300 * 1000);
+      ++retry;
+
+      LoggerD("Retry launch request: %d", retry);
+    }
+
+    if (APP_CONTROL_ERROR_NONE != ret) {
+      delete user_data;
+
+      switch (ret) {
+        case APP_CONTROL_ERROR_INVALID_PARAMETER:
+          LoggerE("app_control_send_launch_request returns APP_CONTROL_ERROR_INVALID_PARAMETER");
+          ReportError(PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter returned."),
+                      &response->get<picojson::object>());
+          return;
+        case APP_CONTROL_ERROR_OUT_OF_MEMORY:
+          LoggerE("app_control_send_launch_request returns APP_CONTROL_ERROR_OUT_OF_MEMORY");
+          ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Out of memory."),
+                      &response->get<picojson::object>());
+          return;
+        case APP_CONTROL_ERROR_LAUNCH_REJECTED:
+        case APP_CONTROL_ERROR_APP_NOT_FOUND:
+          LoggerE("app_control_send_launch_request returns APP_CONTROL_ERROR_APP_NOT_FOUND");
+          ReportError(PlatformResult(ErrorCode::NOT_FOUND_ERR, "No matched application found."),
+                      &response->get<picojson::object>());
+          return;
+        default:
+          LoggerE("app_control_send_launch_request returns UNKNOWN ERROR!!!");
+          throw UnknownException("Unknown error");
+          ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error."),
+                      &response->get<picojson::object>());
+          return;
+      }
+    }
+
+    ReportSuccess(response->get<picojson::object>());
+  };
+
+  auto launch_response = [this](const std::shared_ptr<picojson::value>& response) -> void {
+    this->instance_.PostMessage(response->serialize().c_str());
+  };
+
+  TaskQueue::GetInstance().Queue<picojson::value>(launch, launch_response, response);
+}
+
+void ApplicationManager::FindAppControl(const picojson::value& args) {
+  LoggerD("Entered");
+
+  int callback_id = -1;
+  const auto& callback = args.get(kCallbackId);
+  if (callback.is<double>()) {
+    callback_id = static_cast<int>(callback.get<double>());
+  }
+
+  std::shared_ptr<picojson::value> response(new picojson::value(picojson::object()));
+  picojson::object& response_obj = response->get<picojson::object>();
+  response_obj.insert(
+      std::make_pair(kCallbackId, picojson::value(static_cast<double>(callback_id))));
+
+  PlatformResult result = PlatformResult(ErrorCode::NO_ERROR);
+  const auto& control = args.get("appControl");
+  if (!control.is<picojson::object>()) {
+    LoggerE("Invalid parameter passed.");
+    result = PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter passed.");
+    AsyncResponse(result, &response);
+    return;
+  }
+
+  const picojson::object& app_control_obj = control.get<picojson::object>();
+
+  app_control_h app_control;
+  result = ApplicationUtils::ApplicationControlToService(app_control_obj, &app_control);
+  std::shared_ptr<std::remove_pointer<app_control_h>::type>
+  app_control_ptr(app_control, &app_control_destroy); // automatically release the memory
+
+  auto find = [app_control_ptr](const std::shared_ptr<picojson::value>& response) -> void {
+    auto app_control_matched = [](app_control_h app_control, const char* appid, void* user_data) -> bool {
+      if (nullptr == appid) {
+        LoggerD("appid is NULL");
+        return false;
+      }
+
+      pkgmgrinfo_appinfo_h handle;
+      int ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle);
+      if (PMINFO_R_OK != ret) {
+        LoggerE("Failed to get appInfo");
+      } else {
+        picojson::array* array = static_cast<picojson::array*>(user_data);
+        array->push_back(picojson::value(picojson::object()));
+
+        ApplicationUtils::CreateApplicationInformation(handle, &array->back().get<picojson::object>());
+        pkgmgrinfo_appinfo_destroy_appinfo(handle);
+      }
+
+      return true;
+    };
+
+    picojson::object& response_obj = response->get<picojson::object>();
+    auto it_result = response_obj.find("result");
+    picojson::object& result_obj = it_result->second.get<picojson::object>();
+    auto array = result_obj.insert(
+        std::make_pair("informationArray", picojson::value(picojson::array())));
+
+    int ret = app_control_foreach_app_matched(
+        app_control_ptr.get(), app_control_matched, &array.first->second.get<picojson::array>());
+
+    if (APP_CONTROL_ERROR_NONE != ret) {
+      LoggerE("app_control_foreach_app_matched error: %d", ret);
+
+      ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR,"Unknown error"), &response_obj);
+      // remove copied ApplicationControl from result
+      response_obj.erase(it_result);
+    } else {
+      ReportSuccess(response_obj);
+    }
+  };
+
+  auto find_response = [this](const std::shared_ptr<picojson::value>& response) -> void {
+    this->instance_.PostMessage(response->serialize().c_str());
+  };
+
+  // prepare result object, we need to do that here, as input parameter is passed to result callback
+  auto ret = response_obj.insert(std::make_pair("result", picojson::value(picojson::object())));
+  // reinsert application control
+  ret.first->second.get<picojson::object>().insert(std::make_pair("appControl", args.get("appControl")));
+
+  TaskQueue::GetInstance().Queue<picojson::value>(find, find_response, response);
+}
+
+void ApplicationManager::GetAppsContext(const picojson::value& args) {
+  LoggerD("Entered");
+
+  int callback_id = -1;
+  const auto& callback = args.get(kCallbackId);
+  if (callback.is<double>()) {
+    callback_id = static_cast<int>(callback.get<double>());
+  }
+
+  auto get_apps_context = [](const std::shared_ptr<picojson::value>& response) -> void {
+    picojson::object& response_obj = response->get<picojson::object>();
+    picojson::value result = picojson::value(picojson::object());
+    picojson::object& result_obj = result.get<picojson::object>();
+    picojson::array& array =
+        result_obj.insert(std::make_pair("contexts", picojson::value(
+            picojson::array()))).first->second.get<picojson::array>();
+
+    auto app_context_cb = [](app_context_h app_context, void* user_data) -> bool {
+      if (nullptr == user_data) {
+        return false;
+      }
+
+      picojson::array* array = static_cast<picojson::array*>(user_data);
+      array->push_back(picojson::value(picojson::object()));
+
+      if (!ApplicationUtils::CreateApplicationContext(
+          app_context, &array->back().get<picojson::object>())) {
+        array->pop_back();
+        return false;
+      }
+
+      return true;
+    };
+
+    int ret = app_manager_foreach_app_context(app_context_cb, &array);
+
+    if (APP_MANAGER_ERROR_NONE != ret) {
+      LoggerE("app_manager_foreach_app_context error");
+      ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error."), &response_obj);
+    } else {
+      ReportSuccess(result, response_obj);
+    }
+  };
+
+  auto get_apps_context_response = [this, callback_id](
+      const std::shared_ptr<picojson::value>& response) -> void {
+    picojson::object& obj = response->get<picojson::object>();
+    obj.insert(std::make_pair(kCallbackId, picojson::value(static_cast<double>(callback_id))));
+    this->instance_.PostMessage(response->serialize().c_str());
+  };
+
+  TaskQueue::GetInstance().Queue<picojson::value>(
+      get_apps_context,
+      get_apps_context_response,
+      std::shared_ptr<picojson::value>(new picojson::value(picojson::object())));
+}
+
+void ApplicationManager::GetAppContext(const picojson::value& args, picojson::object* out) {
+  LoggerD("Entered");
+  pid_t pid = 0;
+
+  const auto& context_id = args.get("contextId");
+  if (context_id.is<std::string>()) {
+    try {
+      pid = std::stoi(context_id.get<std::string>());
+    } catch(...) {
+      LoggerE("Failed to convert context id.");
+      ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to convert context id."), out);
+      return;
+    }
+  } else {
+    pid = CurrentApplication::GetInstance().GetProcessId();
+  }
+
+  char* app_id = nullptr;
+
+  int ret = app_manager_get_app_id(pid, &app_id);
+  // automatically release the memory
+  std::unique_ptr<char, void(*)(void*)> app_id_ptr(app_id, &std::free);
+
+  if (APP_MANAGER_ERROR_NONE != ret || nullptr == app_id) {
+    switch(ret) {
+      case APP_MANAGER_ERROR_NO_SUCH_APP:
+        LoggerE("app_manager_get_app_id returned: APP_MANAGER_ERROR_NO_SUCH_APP");
+        ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "No such application exist."), out);
+        return;
+
+      case APP_MANAGER_ERROR_INVALID_PARAMETER:
+        LoggerE("app_manager_get_app_id returned: APP_MANAGER_ERROR_INVALID_PARAMETER");
+        ReportError(PlatformResult(ErrorCode::NOT_FOUND_ERR, "Application not found."), out);
+        return;
+
+      default:
+        LoggerE("app_manager_get_app_id returned: %d", ret);
+        ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error."), out);
+        return;
+    }
+  }
+
+  picojson::value result = picojson::value(picojson::object());
+  ApplicationUtils::CreateApplicationContext(pid, app_id, &result.get<picojson::object>());
+
+  ReportSuccess(result, *out);
+}
+
+void ApplicationManager::GetAppsInfo(const picojson::value& args) {
+  LoggerD("Entered");
+
+  int callback_id = -1;
+  const auto& callback = args.get(kCallbackId);
+  if (callback.is<double>()) {
+    callback_id = static_cast<int>(callback.get<double>());
+  }
+
+  auto get_apps_info = [](const std::shared_ptr<picojson::value>& response) -> void {
+    picojson::object& response_obj = response->get<picojson::object>();
+    picojson::value result = picojson::value(picojson::object());
+    picojson::object& result_obj = result.get<picojson::object>();
+    picojson::array& array =
+        result_obj.insert(std::make_pair("informationArray", picojson::value(
+            picojson::array()))).first->second.get<picojson::array>();
+
+    auto app_info_cb = [](pkgmgrinfo_appinfo_h handle, void* user_data) -> int {
+      if (nullptr == user_data) {
+        return -1;
+      }
+
+      picojson::array* array = static_cast<picojson::array*>(user_data);
+      array->push_back(picojson::value(picojson::object()));
+
+      ApplicationUtils::CreateApplicationInformation(handle, &array->back().get<picojson::object>());
+
+      return 0;
+    };
+
+    int ret = pkgmgrinfo_appinfo_get_installed_list(app_info_cb, &array);
+
+    if (APP_MANAGER_ERROR_NONE != ret) {
+      LoggerE("pkgmgrinfo_appinfo_get_installed_list error");
+      ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error."), &response_obj);
+    } else {
+      ReportSuccess(result, response_obj);
+    }
+  };
+
+  auto get_apps_info_response = [this, callback_id](
+      const std::shared_ptr<picojson::value>& response) -> void {
+    picojson::object& obj = response->get<picojson::object>();
+    obj.insert(std::make_pair(kCallbackId, picojson::value(static_cast<double>(callback_id))));
+    this->instance_.PostMessage(response->serialize().c_str());
+  };
+
+  TaskQueue::GetInstance().Queue<picojson::value>(
+      get_apps_info,
+      get_apps_info_response,
+      std::shared_ptr<picojson::value>(new picojson::value(picojson::object())));
+}
+
+void ApplicationManager::GetAppInfo(const std::string& app_id, picojson::object* out) {
+  LoggerD("Entered");
+
+  pkgmgrinfo_appinfo_h handle = nullptr;
+
+  if (PMINFO_R_OK != pkgmgrinfo_appinfo_get_appinfo(app_id.c_str(), &handle)) {
+    LoggerE("Failed to get app info");
+    ReportError(PlatformResult(ErrorCode::NOT_FOUND_ERR, "Failed to get app info."), out);
+    return;
+  }
+
+  picojson::value result = picojson::value(picojson::object());
+  ApplicationUtils::CreateApplicationInformation(handle, &result.get<picojson::object>());
+  pkgmgrinfo_appinfo_destroy_appinfo(handle);
+
+  ReportSuccess(result, *out);
+}
+
+char* ApplicationManager::GetPackageId(const std::string& app_id) {
+  app_info_h handle;
+  char* pkg_id = nullptr;
+
+  int ret = app_manager_get_app_info(app_id.c_str(), &handle);
+  if (APP_MANAGER_ERROR_NONE != ret) {
+    LoggerE("Failed to get app info.");
+    return nullptr;
+  }
+
+  ret = app_info_get_package(handle, &pkg_id);
+  if (APP_MANAGER_ERROR_NONE != ret) {
+    LoggerE("Failed to get package id.");
+    pkg_id = nullptr;
+  }
+
+  ret = app_info_destroy(handle);
+  if (APP_MANAGER_ERROR_NONE != ret) {
+    LoggerE("Failed to destroy app info.");
+  }
+
+  return pkg_id;
+}
+
+void ApplicationManager::GetAppCerts(const std::string& app_id, picojson::object* out) {
+  LoggerD("Entered");
+
+  char* package_id = nullptr;
+
+  package_id = GetPackageId(app_id);
+  // automatically release the memory
+  std::unique_ptr<char, void(*)(void*)> package_id_ptr(package_id, &std::free);
+
+  if (!package_id) {
+    LoggerE("Failed to get package.");
+    ReportError(PlatformResult(ErrorCode::NOT_FOUND_ERR, "Failed to get package."), out);
+    return;
+  }
+
+  package_info_h pkg_info = nullptr;
+  int ret = package_info_create(package_id, &pkg_info);
+
+  std::unique_ptr<std::remove_pointer<package_info_h>::type, int(*)(package_info_h)>
+  pkg_info_ptr(pkg_info, &package_info_destroy); // automatically release the memory
+
+  if (PACKAGE_MANAGER_ERROR_NONE != ret) {
+    LoggerE("Failed to get package info.");
+    ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to get package info."), out);
+    return;
+  }
+
+  auto cert_info_cb = [](package_info_h handle, package_cert_type_e cert_type,
+      const char* cert_value, void* user_data) -> bool {
+    const char* cert_name = nullptr;
+
+    switch(cert_type) {
+      case PACKAGE_INFO_AUTHOR_ROOT_CERT:
+        cert_name = "AUTHOR_ROOT";
+        break;
+      case PACKAGE_INFO_AUTHOR_INTERMEDIATE_CERT:
+        cert_name = "AUTHOR_INTERMEDIATE";
+        break;
+      case PACKAGE_INFO_AUTHOR_SIGNER_CERT:
+        cert_name = "AUTHOR_SIGNER";
+        break;
+      case PACKAGE_INFO_DISTRIBUTOR_ROOT_CERT:
+        cert_name = "DISTRIBUTOR_ROOT";
+        break;
+      case PACKAGE_INFO_DISTRIBUTOR_INTERMEDIATE_CERT:
+        cert_name = "DISTRIBUTOR_INTERMEDIATE";
+        break;
+      case PACKAGE_INFO_DISTRIBUTOR_SIGNER_CERT:
+        cert_name = "DISTRIBUTOR_SIGNER";
+        break;
+      case PACKAGE_INFO_DISTRIBUTOR2_ROOT_CERT:
+        cert_name = "DISTRIBUTOR2_ROOT";
+        break;
+      case PACKAGE_INFO_DISTRIBUTOR2_INTERMEDIATE_CERT:
+        cert_name = "DISTRIBUTOR2_INTERMEDIATE";
+        break;
+      case PACKAGE_INFO_DISTRIBUTOR2_SIGNER_CERT:
+        cert_name = "DISTRIBUTOR2_SIGNER";
+        break;
+      default:
+        LoggerD("Unknown certificate type: %d", cert_type);
+        break;
+    }
+
+    picojson::array* array = static_cast<picojson::array*>(user_data);
+    array->push_back(picojson::value(picojson::object()));
+
+    ApplicationUtils::CreateApplicationCertificate(
+        cert_name, cert_value, &array->back().get<picojson::object>());
+
+    return true;
+  };
+
+  picojson::value result = picojson::value(picojson::array());
+
+  ret = package_info_foreach_cert_info(pkg_info, cert_info_cb, &result.get<picojson::array>());
+
+  if ((PACKAGE_MANAGER_ERROR_NONE != ret) && (PACKAGE_MANAGER_ERROR_IO_ERROR != ret)) {
+    LoggerE("Failed to get certificates info.");
+    ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to get certificates info."), out);
+    return;
+  }
+
+  ReportSuccess(result, *out);
+}
+
+void ApplicationManager::GetAppSharedUri(const std::string& app_id, picojson::object* out) {
+  LoggerD("Entered");
+
+  char* package_id = nullptr;
+
+  package_id = GetPackageId(app_id);
+  // automatically release the memory
+  std::unique_ptr<char, void(*)(void*)> package_id_ptr(package_id, &std::free);
+
+  if (!package_id) {
+    LoggerE("Failed to get package.");
+    ReportError(PlatformResult(ErrorCode::NOT_FOUND_ERR, "Failed to get package."), out);
+    return;
+  }
+
+  pkgmgrinfo_pkginfo_h pkg_info = nullptr;
+
+  int ret = pkgmgrinfo_pkginfo_get_pkginfo(package_id, &pkg_info);
+  std::unique_ptr<std::remove_pointer<pkgmgrinfo_pkginfo_h>::type, int(*)(pkgmgrinfo_pkginfo_h)>
+  pkg_info_ptr(pkg_info, &pkgmgrinfo_pkginfo_destroy_pkginfo); // automatically release the memory
+
+  if (PMINFO_R_OK != ret) {
+    LoggerE("Failed to get package info.");
+    ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to get package info."), out);
+    return;
+  }
+
+  char* root_path = nullptr;
+  ret = pkgmgrinfo_pkginfo_get_root_path(pkg_info, &root_path);
+
+  if (PMINFO_R_OK != ret || nullptr == root_path) {
+    LoggerE("Failed to get root path.");
+    ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to get root path."), out);
+    return;
+  }
+
+  picojson::value result = picojson::value(kTizenApisFileScheme +
+                                           root_path +
+                                           kTizenApisAppSlash +
+                                           kTizenApisAppShared +
+                                           kTizenApisAppSlash);
+  ReportSuccess(result, *out);
+}
+
+void ApplicationManager::GetAppMetaData(const std::string& app_id, picojson::object* out) {
+  LoggerD("Entered");
+
+  pkgmgrinfo_appinfo_h handle = nullptr;
+
+  int ret = pkgmgrinfo_appinfo_get_appinfo(app_id.c_str(), &handle);
+  std::unique_ptr<std::remove_pointer<pkgmgrinfo_appinfo_h>::type, int(*)(pkgmgrinfo_appinfo_h)>
+  pkg_info_ptr(handle, &pkgmgrinfo_appinfo_destroy_appinfo); // automatically release the memory
+
+  if (PMINFO_R_OK != ret) {
+    LoggerE("Failed to get app info.");
+    ReportError(PlatformResult(ErrorCode::NOT_FOUND_ERR, "Failed to get app info."), out);
+    return;
+  }
+
+  auto meta_data_cb = [](const char* meta_key, const char* meta_value, void* user_data) -> int {
+    if (nullptr == meta_key || nullptr == meta_value) {
+      LoggerE("meta_key or meta_value is null");
+      return 0;
+    }
+
+    picojson::array* array = static_cast<picojson::array*>(user_data);
+    array->push_back(picojson::value(picojson::object()));
+
+    ApplicationUtils::CreateApplicationMetaData(meta_key, meta_value,
+                                                &array->back().get<picojson::object>());
+    return 0;
+  };
+
+  picojson::value result = picojson::value(picojson::array());
+  ret = pkgmgrinfo_appinfo_foreach_metadata(handle, meta_data_cb, &result.get<picojson::array>());
+
+  if (PMINFO_R_OK != ret) {
+    LoggerE("Failed to get metadata.");
+    ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to get metadata."), out);
+    return;
+  }
+
+  ReportSuccess(result, *out);
+}
+
+class ApplicationListChangedBroker {
+ public:
+  enum class Event {
+    kInstalled,
+    kUpdated,
+    kUninstalled,
+  };
+
+  static int ClientStatusListener(int id, const char* type, const char* package, const char* key,
+                                  const char* val, const void* msg, void* data) {
+    LoggerD("Entered");
+    ApplicationListChangedBroker* that = static_cast<ApplicationListChangedBroker*>(data);
+
+    if (0 == strcasecmp(key, kStartKey)) {
+      that->HandleStart(val, package);
+    } else if (0 == strcasecmp(key, kEndKey) && 0 == strcasecmp(val, kOkValue)) {
+      that->HandleEnd(package);
+    } else {
+      LoggerD("Ignored key: %s", key);
+    }
+
+    return 0;
+  }
+
+  void AddApplicationInstance(ApplicationInstance* app_instance) {
+    LoggerD("Entered");
+      app_instance_list_.push_back(app_instance);
+  }
+
+  void RemoveApplicationInstance(ApplicationInstance* app_instance) {
+    LoggerD("Entered");
+    for (auto it = app_instance_list_.begin(); it != app_instance_list_.end(); it++) {
+      if (*it == app_instance) {
+       app_instance_list_.erase(it);
+       return;
+      }
+    }
+  }
+
+ private:
+  void HandleStart(const char* event_type, const char* package) {
+    LoggerD("Entered");
+    app_list_.clear();
+    set_event_type(event_type);
+
+    if (Event::kUninstalled == event_type_) {
+      // we need to get information about application ID before it is uninstalled
+      GetApplicationIdsFromPackage(package);
+    }
+  }
+
+  void HandleEnd(const char* package) {
+    LoggerD("Entered");
+
+    if (Event::kUninstalled != event_type_) {
+      GetApplicationIdsFromPackage(package);
+    }
+
+    for (auto& app_id : app_list_) {
+      picojson::value value = picojson::value(picojson::object());
+      picojson::object& data_obj = value.get<picojson::object>();
+
+      switch (event_type_) {
+        case Event::kInstalled:
+          data_obj.insert(std::make_pair(kAction, picojson::value(kOnInstalled)));
+          break;
+
+        case Event::kUpdated:
+          data_obj.insert(std::make_pair(kAction, picojson::value(kOnUpdated)));
+          break;
+
+        case Event::kUninstalled:
+          data_obj.insert(std::make_pair(kAction, picojson::value(kOnUninstalled)));
+          break;
+      }
+
+      switch (event_type_) {
+        case Event::kInstalled:
+        case Event::kUpdated:
+        {
+          pkgmgrinfo_appinfo_h handle = nullptr;
+          if (PMINFO_R_OK != pkgmgrinfo_appinfo_get_appinfo(app_id.c_str(), &handle)) {
+            LoggerE("Failed to get application information handle.");
+            continue;
+          }
+          auto info = data_obj.insert(std::make_pair(kData, picojson::value(picojson::object())));
+          ApplicationUtils::CreateApplicationInformation(
+              handle, &info.first->second.get<picojson::object>());
+          pkgmgrinfo_appinfo_destroy_appinfo(handle);
+        }
+        break;
+
+        case Event::kUninstalled:
+          data_obj.insert(std::make_pair(kData, picojson::value(app_id)));
+          break;
+      }
+
+      data_obj["listenerId"] = picojson::value("ApplicationEventListener");
+
+      for (auto instance : app_instance_list_) {
+        instance->PostMessage(value.serialize().c_str());
+      }
+    }
+  }
+
+  void GetApplicationIdsFromPackage(const char* package) {
+    LoggerD("Entered");
+    package_info_h package_info = nullptr;
+
+    int ret = package_manager_get_package_info(package, &package_info);
+    if (PACKAGE_MANAGER_ERROR_NONE != ret) {
+      LoggerE("Failed to create package info");
+      return;
+    }
+
+    ret = package_info_foreach_app_from_package(package_info,
+                                                PACKAGE_INFO_ALLAPP,
+                                                ApplicationIdCallback,
+                                                this);
+    if (PACKAGE_MANAGER_ERROR_NONE != ret) {
+      LoggerE("Failed to get application IDs");
+    }
+
+    ret = package_info_destroy(package_info);
+    if (PACKAGE_MANAGER_ERROR_NONE != ret) {
+      LoggerE("Failed to destroy package info");
+    }
+  }
+
+  void set_event_type(const char* type) {
+    LoggerD("Entered");
+    if (0 == strcasecmp(type, kInstallEvent)) {
+      event_type_ = Event::kInstalled;
+    } else if (0 == strcasecmp(type, kUpdateEvent)) {
+      event_type_ = Event::kUpdated;
+    } else if (0 == strcasecmp(type, kUninstallEvent)) {
+      event_type_ = Event::kUninstalled;
+    }
+  }
+
+  static bool ApplicationIdCallback(package_info_app_component_type_e comp_type,
+                                    const char* app_id, void* user_data) {
+    LoggerD("Entered");
+    if (nullptr != app_id) {
+      static_cast<ApplicationListChangedBroker*>(user_data)->app_list_.push_back(app_id);
+    }
+    return true;
+  }
+
+  Event event_type_;
+  std::vector<std::string> app_list_;
+  std::vector<ApplicationInstance*> app_instance_list_;
+};
+
+static ApplicationListChangedBroker g_application_list_changed_broker;
+
+void ApplicationManager::StartAppInfoEventListener(picojson::object* out) {
+  LoggerD("Entered");
+
+  if (nullptr == pkgmgr_client_handle_) {
+    pkgmgr_client_handle_ = pkgmgr_client_new(PC_LISTENING);
+
+    if (nullptr == pkgmgr_client_handle_) {
+      LoggerE("Failed to register listener.");
+      ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to register listener."), out);
+      return;
+    }
+
+    g_application_list_changed_broker.AddApplicationInstance(&instance_);
+    pkgmgr_client_listen_status(pkgmgr_client_handle_,
+                                ApplicationListChangedBroker::ClientStatusListener,
+                                &g_application_list_changed_broker);
+  } else {
+    LoggerD("Broker callback is already registered.");
+  }
+
+  ReportSuccess(*out);
+}
+
+void ApplicationManager::StopAppInfoEventListener() {
+  LoggerD("Entered");
+
+  if (nullptr != pkgmgr_client_handle_) {
+    pkgmgr_client_free(pkgmgr_client_handle_);
+    pkgmgr_client_handle_ = nullptr;
+    g_application_list_changed_broker.RemoveApplicationInstance(&instance_);
+  } else {
+    LoggerD("Broker callback is already unregistered.");
+  }
+}
+
+void ApplicationManager::GetApplicationInformationSize(const picojson::value& args,
+                                                       picojson::object* out) {
+  LoggerD("Entered");
+
+  const auto& package_id = args.get("packageId");
+  if (!package_id.is<std::string>()) {
+    LoggerE("Invalid parameter passed.");
+    ReportError(PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter passed."), out);
+    return;
+  }
+
+  const std::string& package_id_str = package_id.get<std::string>();
+
+  // get installed size from package server (to solve smack issue)
+  pkgmgr_client* pc = pkgmgr_client_new(PC_REQUEST);
+  int size = -1;
+
+  if (nullptr == pc) {
+    LoggerE("Failed to create pkgmgr client");
+  } else {
+    size = pkgmgr_client_request_service(PM_REQUEST_GET_SIZE, PM_GET_TOTAL_SIZE, pc, NULL,
+                                         package_id_str.c_str(), NULL, NULL, NULL);
+
+    if (size < 0) {
+      LoggerE("Failed to get installed size");
+    }
+
+    pkgmgr_client_free(pc);
+  }
+
+  picojson::value result = picojson::value(picojson::object());
+  picojson::object& result_obj = result.get<picojson::object>();
+  result_obj.insert(std::make_pair("size", picojson::value(static_cast<double>(size))));
+
+  ReportSuccess(result, *out);
+}
+
+} // namespace application
+} // namespace extension
diff --git a/src/application/application_manager.h b/src/application/application_manager.h
new file mode 100644 (file)
index 0000000..0e4e33f
--- /dev/null
@@ -0,0 +1,53 @@
+// Copyright 2015 Samsung Electronics Co, Ltd. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SRC_APPLICATION_APPLICATION_MANAGER_H__
+#define SRC_APPLICATION_APPLICATION_MANAGER_H__
+
+#include <string>
+#include <memory>
+
+#include <package-manager.h>
+
+#include "common/picojson.h"
+#include "common/platform_result.h"
+
+namespace extension {
+namespace application {
+
+class ApplicationInstance;
+
+class ApplicationManager {
+ public:
+  explicit ApplicationManager(ApplicationInstance& instance);
+  ~ApplicationManager();
+
+  void GetCurrentApplication(const std::string& app_id, picojson::object* out);
+  void Kill(const picojson::value& args);
+  void Launch(const picojson::value& args);
+  void LaunchAppControl(const picojson::value& args);
+  void FindAppControl(const picojson::value& args);
+  void GetAppsContext(const picojson::value& args);
+  void GetAppContext(const picojson::value& args, picojson::object* out);
+  void GetAppsInfo(const picojson::value& args);
+  void GetAppInfo(const std::string& app_id, picojson::object* out);
+  void GetAppCerts(const std::string& app_id, picojson::object* out);
+  void GetAppSharedUri(const std::string& app_id, picojson::object* out);
+  void GetAppMetaData(const std::string& app_id, picojson::object* out);
+  void StartAppInfoEventListener(picojson::object* out);
+  void StopAppInfoEventListener();
+  void GetApplicationInformationSize(const picojson::value& args, picojson::object* out);
+  void AsyncResponse(common::PlatformResult& result, std::shared_ptr<picojson::value>* response);
+
+ private:
+  char* GetPackageId(const std::string& app_id);
+
+  pkgmgr_client* pkgmgr_client_handle_;
+  ApplicationInstance& instance_;
+};
+
+} // namespace application
+} // namespace extension
+
+#endif // SRC_APPLICATION_APPLICATION_MANAGER_H__
diff --git a/src/application/application_metadata.cc b/src/application/application_metadata.cc
deleted file mode 100644 (file)
index 4014bf7..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2014 Samsung Electronics Co, Ltd. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "application/application_metadata.h"
-
-#include <app_manager.h>
-
-#include "common/logger.h"
-#include "tizen/tizen.h"
-
-namespace extension {
-namespace application {
-
-ApplicationMetaData::ApplicationMetaData() {
-}
-
-ApplicationMetaData::~ApplicationMetaData() {
-}
-
-const picojson::value& ApplicationMetaData::Value() {
-  if (value_.is<picojson::null>() && IsValid()) {
-    picojson::object obj;
-    obj["key"] = picojson::value(meta_key_);
-    obj["value"] = picojson::value(meta_value_);
-    value_ = picojson::value(obj);
-  }
-  return value_;
-}
-
-bool ApplicationMetaData::IsValid() const {
-  return error_.empty();
-}
-
-std::string ApplicationMetaData::get_meta_key() const {
-  return meta_key_;
-}
-
-void ApplicationMetaData::set_meta_key(const std::string& meta_key) {
-  meta_key_ = meta_key;
-}
-
-std::string ApplicationMetaData::get_meta_value() const {
-  return meta_value_;
-}
-
-void ApplicationMetaData::set_meta_value(const std::string& meta_value) {
-  meta_value_ = meta_value;
-}
-
-}  // namespace application
-}  // namespace extension
diff --git a/src/application/application_metadata.h b/src/application/application_metadata.h
deleted file mode 100644 (file)
index 53920b5..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2014 Samsung Electronics Co, Ltd. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SRC_APPLICATION_APPLICATION_METADATA_H_
-#define SRC_APPLICATION_APPLICATION_METADATA_H_
-
-#include <string>
-#include <memory>
-#include <vector>
-
-#include "common/picojson.h"
-#include "tizen/tizen.h"
-
-namespace extension {
-namespace application {
-
-class ApplicationMetaData;
-typedef std::shared_ptr<ApplicationMetaData> ApplicationMetaDataPtr;
-
-typedef std::vector<ApplicationMetaDataPtr> ApplicationMetaDataArray;
-typedef std::shared_ptr<ApplicationMetaDataArray> ApplicationMetaDataArrayPtr;
-
-class ApplicationMetaData {
- public:
-  ApplicationMetaData();
-  ~ApplicationMetaData();
-
-  const picojson::value& Value();
-  bool IsValid() const;
-
-  std::string get_meta_key() const;
-  void set_meta_key(const std::string& meta_key);
-
-  std::string get_meta_value() const;
-  void set_meta_value(const std::string& meta_value);
-
- private:
-  std::string meta_key_;
-  std::string meta_value_;
-
-  picojson::object data_;
-  picojson::object error_;
-  picojson::value value_;
-};
-
-}  // namespace application
-}  // namespace extension
-
-#endif  // SRC_APPLICATION_APPLICATION_METADATA_H_
diff --git a/src/application/application_utils.cc b/src/application/application_utils.cc
new file mode 100644 (file)
index 0000000..8d8e14d
--- /dev/null
@@ -0,0 +1,376 @@
+// Copyright 2015 Samsung Electronics Co, Ltd. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "application_utils.h"
+
+#include <memory>
+
+#include <app_manager.h>
+
+#include "common/logger.h"
+#include "common/platform_result.h"
+
+using namespace common;
+
+namespace extension {
+namespace application {
+
+void ApplicationUtils::CreateApplicationInformation(const pkgmgrinfo_appinfo_h handle,
+                                                    picojson::object* app_info) {
+
+  char* tmp_str = nullptr;
+  int ret = 0;
+
+  // application ID
+  ret = pkgmgrinfo_appinfo_get_appid(handle, &tmp_str);
+  if ((PMINFO_R_OK != ret) || (nullptr == tmp_str)) {
+    LoggerE("Failed to get appid");
+  } else {
+    app_info->insert(std::make_pair("id", picojson::value(tmp_str)));
+  }
+  tmp_str = nullptr;
+
+  // name
+  ret = pkgmgrinfo_appinfo_get_label(handle, &tmp_str);
+  if ((PMINFO_R_OK != ret) || (nullptr == tmp_str)) {
+    LoggerE("Failed to get label");
+  } else {
+    app_info->insert(std::make_pair("name", picojson::value(tmp_str)));
+  }
+  tmp_str = nullptr;
+
+  // icon path
+  ret = pkgmgrinfo_appinfo_get_icon(handle, &tmp_str);
+  if ((PMINFO_R_OK != ret) || (nullptr == tmp_str)) {
+    LoggerE("Failed to get icon path");
+  } else {
+    app_info->insert(std::make_pair("iconPath", picojson::value(tmp_str)));
+  }
+  tmp_str = nullptr;
+
+  // show
+  bool no_display = false;
+  ret = pkgmgrinfo_appinfo_is_nodisplay(handle, &no_display);
+  if (PMINFO_R_OK != ret) {
+    LoggerE("Failed to get nodisplay");
+  } else {
+    app_info->insert(std::make_pair("show", picojson::value(!no_display)));
+  }
+
+  // categories
+  picojson::value categories = picojson::value(picojson::array());
+  picojson::array& categories_array = categories.get<picojson::array>();
+  app_info->insert(std::make_pair("categories", categories));
+
+  ret = pkgmgrinfo_appinfo_foreach_category(
+      handle,
+      [](const char* category, void* user_data) -> int {
+    picojson::array* categories_array = static_cast<picojson::array*>(user_data);
+
+    if ((nullptr != category) && (nullptr != categories_array)) {
+      categories_array->push_back(picojson::value(category));
+    }
+
+    return 0;
+  },
+  &categories_array);
+
+  if (PMINFO_R_OK != ret) {
+    LoggerE("Failed to get categories");
+  }
+
+  // package ID
+  ret = pkgmgrinfo_appinfo_get_pkgid(handle, &tmp_str);
+  if ((PMINFO_R_OK != ret) || (nullptr == tmp_str)) {
+    LoggerE("Failed to get pkgid");
+  } else {
+    app_info->insert(std::make_pair("packageId", picojson::value(tmp_str)));
+  }
+
+  pkgmgrinfo_pkginfo_h pkginfo;
+  ret = pkgmgrinfo_pkginfo_get_pkginfo(tmp_str, &pkginfo);
+  if (PMINFO_R_OK != ret) {
+    LoggerE("Failed to get package info");
+  } else {
+    // version
+    tmp_str = nullptr;
+    ret = pkgmgrinfo_pkginfo_get_version(pkginfo, &tmp_str);
+    if ((PMINFO_R_OK != ret) || (nullptr == tmp_str)) {
+      LoggerE("Failed to get version");
+    } else {
+      app_info->insert(std::make_pair("version", picojson::value(tmp_str)));
+    }
+    tmp_str = nullptr;
+
+    // installation date
+    int installed_time = 0;
+    ret = pkgmgrinfo_pkginfo_get_installed_time(pkginfo, &installed_time);
+    if (ret != PMINFO_R_OK) {
+      LoggerE("Fail to get installed date");
+    } else {
+      app_info->insert(std::make_pair("installDate", picojson::value(1000.0 * installed_time)));
+    }
+
+    pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
+  }
+
+  // size is set at first attribute access (performance)
+}
+
+bool ApplicationUtils::CreateApplicationContext(const app_context_h handle,
+                                                picojson::object* app_context) {
+  char* app_id = nullptr;
+
+  int ret = app_context_get_app_id(handle, &app_id);
+  // automatically release the memory
+  std::unique_ptr<char, void(*)(void*)> app_id_ptr(app_id, &std::free);
+
+  if ((APP_MANAGER_ERROR_NONE != ret) || (nullptr == app_id)) {
+    LoggerD("Failed to get application ID from context.");
+    return false;
+  }
+
+  pid_t pid;
+  ret = app_context_get_pid(handle, &pid);
+
+  if(ret != APP_MANAGER_ERROR_NONE) {
+    LoggerD("Failed to get pid from context.");
+    return false;
+  }
+
+  CreateApplicationContext(pid, app_id, app_context);
+
+  return true;
+}
+
+void ApplicationUtils::CreateApplicationContext(pid_t pid, const std::string& app_id,
+                                                picojson::object* app_context) {
+
+  app_context->insert(std::make_pair("id", picojson::value(std::to_string(pid))));
+  app_context->insert(std::make_pair("appId", picojson::value(app_id)));
+}
+
+void ApplicationUtils::CreateApplicationCertificate(const char* cert_type,
+                                                    const char* cert_value,
+                                                    picojson::object* app_certificate) {
+
+  app_certificate->insert(std::make_pair("type", picojson::value(cert_type)));
+  app_certificate->insert(std::make_pair("value", picojson::value(cert_value)));
+}
+
+void ApplicationUtils::CreateApplicationMetaData(const char* key,
+                                                 const char* value,
+                                                 picojson::object* app_meta_data) {
+
+  app_meta_data->insert(std::make_pair("key", picojson::value(key)));
+  app_meta_data->insert(std::make_pair("value", picojson::value(value)));
+}
+
+PlatformResult ApplicationUtils::ApplicationControlToService(
+    const picojson::object& app_control_obj,
+    app_control_h* app_control) {
+
+  const auto it_operation = app_control_obj.find("operation");
+  const auto it_uri = app_control_obj.find("uri");
+  const auto it_mime = app_control_obj.find("mime");
+  const auto it_category = app_control_obj.find("category");
+  const auto it_data = app_control_obj.find("data");
+  const auto it_app_control_end = app_control_obj.end();
+
+  if (it_operation == it_app_control_end ||
+      it_uri == it_app_control_end ||
+      it_mime == it_app_control_end ||
+      it_category == it_app_control_end ||
+      it_data == it_app_control_end ||
+      !it_operation->second.is<std::string>() ||
+      !it_data->second.is<picojson::array>()) {
+    LoggerE("Invalid parameter was passed.");
+    return PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter was passed.");
+  }
+
+  app_control_create(app_control);
+
+  // operation
+  app_control_set_operation(*app_control, it_operation->second.get<std::string>().c_str());
+
+  // uri
+  if (it_uri->second.is<std::string>()) {
+    app_control_set_uri(*app_control, it_uri->second.get<std::string>().c_str());
+  }
+
+  // mime
+  if (it_mime->second.is<std::string>()) {
+    app_control_set_mime(*app_control, it_mime->second.get<std::string>().c_str());
+  }
+
+  // category
+  if (it_category->second.is<std::string>()) {
+    app_control_set_category(*app_control, it_category->second.get<std::string>().c_str());
+  }
+
+  // ApplicationControlData
+  const picojson::array& data = it_data->second.get<picojson::array>();
+
+  for (auto iter = data.begin(); iter != data.end(); ++iter) {
+    if (iter->is<picojson::object>()) {
+      PlatformResult ret =
+          ApplicationControlDataToServiceExtraData(iter->get<picojson::object>(), *app_control);
+      if (ret.IsError()) {
+        return ret;
+      }
+    }
+  }
+
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult ApplicationUtils::ApplicationControlDataToServiceExtraData(
+    const picojson::object& app_control_data,
+    app_control_h app_control) {
+
+  const auto it_key = app_control_data.find("key");
+  const auto it_value = app_control_data.find("value");
+  const auto it_app_control_data_end = app_control_data.end();
+
+  if (it_key == it_app_control_data_end ||
+      it_value == it_app_control_data_end ||
+      !it_key->second.is<std::string>() ||
+      !it_value->second.is<picojson::array>()) {
+    LoggerE("Problem with key or value.");
+    return PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter was passed.");
+  }
+
+  const std::string& key = it_key->second.get<std::string>();
+  const picojson::array& value = it_value->second.get<picojson::array>();
+
+  const size_t size = value.size();
+  const char** arr = new const char*[size];
+  size_t i = 0;
+
+  for (auto iter = value.begin(); iter != value.end(); ++iter, ++i) {
+    if (iter->is<std::string>()) {
+      arr[i] = iter->get<std::string>().c_str();
+    }
+  }
+
+  if (1 == size) {
+    app_control_add_extra_data(app_control, key.c_str(), arr[0]);
+  } else {
+    app_control_add_extra_data_array(app_control, key.c_str(), arr, size);
+  }
+
+  delete[] arr;
+  return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+void ApplicationUtils::ServiceToApplicationControl(app_control_h app_control,
+                                                   picojson::object* app_control_obj) {
+  int ret = 0;
+  char* tmp_str = nullptr;
+  auto clear = [](char*& str) {
+    free(str);
+    str = nullptr;
+  };
+
+  ret = app_control_get_operation(app_control, &tmp_str);
+  if ((APP_CONTROL_ERROR_NONE == ret) && (nullptr != tmp_str)) {
+    LoggerD("operation: %s", tmp_str);
+    app_control_obj->insert(std::make_pair("operation", picojson::value(std::string(tmp_str))));
+  }
+  clear(tmp_str);
+
+  ret = app_control_get_uri(app_control, &tmp_str);
+  if ((APP_CONTROL_ERROR_NONE == ret) && (nullptr != tmp_str)) {
+    LoggerD("URI: %s", tmp_str);
+    app_control_obj->insert(std::make_pair("uri", picojson::value(std::string(tmp_str))));
+  }
+  clear(tmp_str);
+
+  ret = app_control_get_mime(app_control, &tmp_str);
+  if ((APP_CONTROL_ERROR_NONE == ret) && (nullptr != tmp_str)) {
+    LoggerD("MIME: %s", tmp_str);
+    app_control_obj->insert(std::make_pair("mime", picojson::value(std::string(tmp_str))));
+  }
+  clear(tmp_str);
+
+  ret = app_control_get_category(app_control, &tmp_str);
+  if ((APP_CONTROL_ERROR_NONE == ret) && (nullptr != tmp_str)) {
+    LoggerD("category: %s", tmp_str);
+    app_control_obj->insert(std::make_pair("category", picojson::value(std::string(tmp_str))));
+  }
+  clear(tmp_str);
+
+  app_control_obj->insert(std::make_pair("data", picojson::value(picojson::array())));
+  ServiceToApplicationControlDataArray(
+      app_control, &app_control_obj->find("data")->second.get<picojson::array>());
+}
+
+void ApplicationUtils::ServiceExtraDataToApplicationControlData(app_control_h app_control,
+                                                                const std::string& key,
+                                                                picojson::object* app_control_data) {
+  int ret = 0;
+  bool is_array = false;
+
+  ret = app_control_is_extra_data_array(app_control, key.c_str(), &is_array);
+
+  if (APP_CONTROL_ERROR_NONE != ret) {
+    LoggerE("Failed to check whether extra data is array or not");
+    return;
+  }
+
+  app_control_data->insert(std::make_pair("key", picojson::value(key)));
+  picojson::array value_array;
+
+  if (is_array) {
+    int length = 0;
+    char** value = nullptr;
+
+    ret = app_control_get_extra_data_array(app_control, key.c_str(), &value, &length);
+
+    if ((APP_CONTROL_ERROR_NONE == ret) && (nullptr != value)) {
+      for (int i = 0; i < length; ++i) {
+        if (value[i]) {
+          value_array.push_back(picojson::value(value[i]));
+          free(value[i]);
+        }
+      }
+      free(value);
+    } else {
+      LoggerE("Failed to get extra data array, errno: %d", ret);
+    }
+  } else {
+    char* value = nullptr;
+
+    ret = app_control_get_extra_data(app_control, key.c_str(), &value);
+
+    if ((APP_CONTROL_ERROR_NONE == ret) && (nullptr != value)) {
+      value_array.push_back(picojson::value(value));
+      free(value);
+    } else {
+      LoggerE("Failed to get extra data, errno: %d", ret);
+    }
+  }
+
+  app_control_data->insert(std::make_pair("value", picojson::value(value_array)));
+}
+
+bool ApplicationUtils::ServiceToApplicationControlDataArray(app_control_h app_control,
+                                                            picojson::array* data) {
+  int ret = app_control_foreach_extra_data(app_control, ServiceExtraDataCallback, data);
+  return APP_CONTROL_ERROR_NONE == ret;
+}
+
+bool ApplicationUtils::ServiceExtraDataCallback(app_control_h app_control,
+                                                const char* key,
+                                                void* user_data) {
+  picojson::array* data = static_cast<picojson::array*>(user_data);
+
+  data->push_back(picojson::value(picojson::object()));
+  ServiceExtraDataToApplicationControlData(app_control, key, &data->back().get<picojson::object>());
+
+  return true;
+}
+
+} // namespace application
+} // namespace extension
diff --git a/src/application/application_utils.h b/src/application/application_utils.h
new file mode 100644 (file)
index 0000000..8a9e22a
--- /dev/null
@@ -0,0 +1,63 @@
+// Copyright 2015 Samsung Electronics Co, Ltd. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SRC_APPLICATION_APPLICATION_UTILS_H__
+#define SRC_APPLICATION_APPLICATION_UTILS_H__
+
+#include <pkgmgr-info.h>
+#include <app_context.h>
+#include <app_control.h>
+
+#include "common/picojson.h"
+#include "common/platform_result.h"
+
+namespace extension {
+namespace application {
+
+class ApplicationUtils {
+ public:
+  static void CreateApplicationInformation(const pkgmgrinfo_appinfo_h handle,
+                                           picojson::object* app_info);
+
+  static bool CreateApplicationContext(const app_context_h handle,
+                                       picojson::object* app_context);
+
+  static void CreateApplicationContext(pid_t pid,
+                                       const std::string& app_id,
+                                       picojson::object* app_context);
+
+  static void CreateApplicationCertificate(const char* cert_type,
+                                           const char* cert_value,
+                                           picojson::object* app_certificate);
+
+  static void CreateApplicationMetaData(const char* key,
+                                        const char* value,
+                                        picojson::object* app_meta_data);
+
+  static common::PlatformResult ApplicationControlToService(const picojson::object& app_control_obj,
+                                                            app_control_h* app_control);
+
+  static common::PlatformResult ApplicationControlDataToServiceExtraData(
+      const picojson::object& app_control_data,
+      app_control_h app_control);
+
+  static void ServiceToApplicationControl(app_control_h app_control,
+                                          picojson::object* app_control_obj);
+
+  static void ServiceExtraDataToApplicationControlData(app_control_h app_control,
+                                                       const std::string& key,
+                                                       picojson::object* app_control_data);
+
+  static bool ServiceToApplicationControlDataArray(app_control_h app_control,
+                                                   picojson::array* data);
+ private:
+  static bool ServiceExtraDataCallback(app_control_h app_control,
+                                       const char* key,
+                                       void* user_data);
+};
+
+} // namespace application
+} // namespace extension
+
+#endif // SRC_APPLICATION_APPLICATION_UTILS_H__
index 7cfb078fd5dacea1655e81cc6a0f50670951ac06..c46ef5e8ac1113803fbdded1095697b600997400 100644 (file)
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "application/requested_application_control.h"
+#include "requested_application_control.h"
 
 #include <app_manager.h>
+#include <app_control_internal.h>
+#include <bundle.h>
 
 #include "common/logger.h"
-#include "tizen/tizen.h"
+#include "application/application_utils.h"
+
+using namespace common;
+using namespace tools;
 
 namespace extension {
 namespace application {
 
-RequestedApplicationControl::RequestedApplicationControl() {
-}
+PlatformResult RequestedApplicationControl::set_bundle(const std::string& encoded_bundle) {
+  LoggerD("Entered");
 
-RequestedApplicationControl::~RequestedApplicationControl() {
-}
+  if (encoded_bundle != bundle_) {
+    bundle_ = encoded_bundle;
+
+    bundle* bundle = bundle_decode((bundle_raw*)(encoded_bundle.c_str()),
+                                   encoded_bundle.length());
+    app_control_h app_control = nullptr;
+    int ret = app_control_create_event(bundle, &app_control);
+    bundle_free(bundle);
 
-const picojson::value& RequestedApplicationControl::Value() {
-  LoggerD("caller_app_id_: %s", caller_app_id_.c_str());
-  data_["callerAppId"] = picojson::value(caller_app_id_);
-  data_["appControl"] = picojson::value(app_control_.Value());
+    if (APP_CONTROL_ERROR_NONE != ret) {
+      LoggerE("Failed to create app_control");
+      return PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to create app_control.");
+    }
 
-  value_ = picojson::value(data_);
+    set_app_control(app_control);
+  }
 
-  return value_;
+  return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-bool RequestedApplicationControl::IsValid() const {
-  return error_.empty();
+void RequestedApplicationControl::set_app_control(app_control_h app_control) {
+  LoggerD("Entered");
+
+  app_control_.reset(app_control, app_control_destroy);
+
+  char* tmp_str = nullptr;
+  int ret = app_control_get_caller(app_control, &tmp_str);
+
+  if ((APP_CONTROL_ERROR_NONE == ret) && (nullptr != tmp_str)) {
+    caller_app_id_ = tmp_str;
+  } else {
+    LoggerW("Failed to get callerAppId because of platform error");
+    LoggerW("Please ignore if the application is launched in debug mode");
+  }
+
+  free(tmp_str);
 }
 
-std::string RequestedApplicationControl::get_caller_app_id() const {
-  return caller_app_id_;
+void RequestedApplicationControl::ToJson(picojson::object* out) {
+  LoggerD("Entered");
+
+  if (app_control_) {
+    out->insert(std::make_pair("callerAppId", picojson::value(caller_app_id_)));
+    auto appControl = out->insert(std::make_pair(
+        "appControl", picojson::value(picojson::object())));
+    ApplicationUtils::ServiceToApplicationControl(
+        app_control_.get(), &appControl.first->second.get<picojson::object>());
+  }
 }
 
-void RequestedApplicationControl::
-  set_caller_app_id(const std::string& caller_app_id) {
-  caller_app_id_ = caller_app_id;
-  LoggerD("caller_app_id: %s", caller_app_id.c_str());
+void RequestedApplicationControl::ReplyResult(const picojson::value& args, picojson::object* out) {
+  LoggerD("Entered");
+
+  const auto& data_arr = args.get("data");
+  if (!data_arr.is<picojson::array>()) {
+    LoggerE("Invalid parameter passed.");
+    ReportError(PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Invalid parameter passed."), out);
+    return;
+  }
+
+  // read input data
+  PlatformResult result = PlatformResult(ErrorCode::NO_ERROR);
+  const picojson::array& data = data_arr.get<picojson::array>();
+
+  const std::string& encoded_bundle =
+      GetCurrentExtension()->GetRuntimeVariable("encoded_bundle", 1024);
+
+  result = set_bundle(encoded_bundle);
+  if (result.IsError()) {
+    ReportError(result, out);
+    return;
+  }
+
+  // code to check caller liveness
+  result = VerifyCallerPresence();
+  if (result.IsError()) {
+    ReportError(result, out);
+    return;
+  }
+
+  // create reply
+  app_control_h reply;
+  app_control_create(&reply);
+  std::unique_ptr<std::remove_pointer<app_control_h>::type, int(*)(app_control_h)>
+  reply_ptr(reply, &app_control_destroy); // automatically release the memory
+
+  if (!data.empty()) {
+    for (auto iter = data.begin(); iter != data.end(); ++iter) {
+      result = ApplicationUtils::ApplicationControlDataToServiceExtraData(
+          iter->get<picojson::object>(), reply);
+      if (result.IsError()) {
+        ReportError(result, out);
+        return;
+      }
+    }
+  } else {
+    LoggerD("appControlDataArray is empty");
+  }
+
+  // send reply
+  if (APP_CONTROL_ERROR_NONE !=
+      app_control_reply_to_launch_request(reply, app_control_.get(), APP_CONTROL_RESULT_SUCCEEDED)) {
+    LoggerE("Cannot find caller.");
+    ReportError(PlatformResult(ErrorCode::NOT_FOUND_ERR, "Cannot find caller."), out);
+    return;
+  }
+
+  ReportSuccess(*out);
 }
 
-ApplicationControl& RequestedApplicationControl::get_app_control() {
-  return app_control_;
+void RequestedApplicationControl::ReplyFailure(picojson::object* out) {
+  LoggerD("Entered");
+
+  // read input data
+  PlatformResult result = PlatformResult(ErrorCode::NO_ERROR);
+  const std::string& encoded_bundle =
+      GetCurrentExtension()->GetRuntimeVariable("encoded_bundle", 1024);
+
+  result = set_bundle(encoded_bundle);
+  if (result.IsError()) {
+    ReportError(result, out);
+    return;
+  }
+
+  // code to check caller liveness
+  result = VerifyCallerPresence();
+  if (result.IsError()) {
+    ReportError(result, out);
+    return;
+  }
+
+  // create reply
+  app_control_h reply;
+  app_control_create(&reply);
+  std::unique_ptr<std::remove_pointer<app_control_h>::type, int(*)(app_control_h)>
+  reply_ptr(reply, &app_control_destroy); // automatically release the memory
+
+  // send reply
+  int ret = app_control_reply_to_launch_request(reply, app_control_.get(), APP_CONTROL_RESULT_FAILED);
+  if (APP_CONTROL_ERROR_NONE != ret) {
+    LoggerE("Cannot find caller.");
+    ReportError(PlatformResult(ErrorCode::NOT_FOUND_ERR, "Cannot find caller."), out);
+    return;
+  }
+
+  ReportSuccess(*out);
 }
 
-void RequestedApplicationControl::
-  set_app_control(const ApplicationControl& app_control) {
-  app_control_.set_operation(app_control.get_operation());
-  app_control_.set_uri(app_control.get_uri());
-  app_control_.set_mime(app_control.get_mime());
-  app_control_.set_category(app_control.get_category());
-  app_control_.set_data_array(app_control.get_data_array());
+PlatformResult RequestedApplicationControl::VerifyCallerPresence() {
+  LoggerD("Entered");
+
+  if (caller_app_id_.empty()) {
+    LoggerE("caller_app_id_ is empty. This means caller is dead.");
+    return PlatformResult(ErrorCode::NOT_FOUND_ERR, "Cannot find caller.");
+  } else {
+    bool running = false;
+
+    int ret = app_manager_is_running(caller_app_id_.c_str(), &running);
+
+    if ((APP_MANAGER_ERROR_NONE != ret) || !running) {
+      LoggerE("Caller is not running");
+      return PlatformResult(ErrorCode::NOT_FOUND_ERR, "Cannot find caller.");
+    }
+
+    return PlatformResult(ErrorCode::NO_ERROR);
+  }
 }
 
 }  // namespace application
index 07b7c3efc75eb685c13acd5001ec73570a1e91e9..0f50186d099e06447409b14771f354d8a157b197 100644 (file)
@@ -7,40 +7,32 @@
 
 #include <string>
 #include <memory>
+#include <type_traits>
+
+#include <app_control.h>
 
 #include "common/picojson.h"
+#include "common/extension.h"
+#include "common/platform_result.h"
 #include "tizen/tizen.h"
 
-#include "application/application_control.h"
-
 namespace extension {
 namespace application {
 
-class RequestedApplicationControl;
-typedef std::shared_ptr<RequestedApplicationControl>
-  RequestedApplicationControlPtr;
-
 class RequestedApplicationControl {
  public:
-  RequestedApplicationControl();
-  ~RequestedApplicationControl();
-
-  const picojson::value& Value();
-  bool IsValid() const;
-
-  std::string get_caller_app_id() const;
-  void set_caller_app_id(const std::string& caller_app_id);
-
-  ApplicationControl& get_app_control();
-  void set_app_control(const ApplicationControl& app_control);
+  common::PlatformResult set_bundle(const std::string& encoded_bundle);
+  void ToJson(picojson::object* out);
+  void ReplyResult(const picojson::value& args, picojson::object* out);
+  void ReplyFailure(picojson::object* out);
 
  private:
-  std::string caller_app_id_;
-  ApplicationControl app_control_;
+  void set_app_control(app_control_h app_control);
+  common::PlatformResult VerifyCallerPresence();
 
-  picojson::object data_;
-  picojson::object error_;
-  picojson::value value_;
+  std::string bundle_;
+  std::shared_ptr<std::remove_pointer<app_control_h>::type> app_control_;
+  std::string caller_app_id_;
 };
 
 }  // namespace application