hti/PC_Tools/HTIGateway/ServicePlugins/HtiApplication/HtiApplication.cpp
branchRCL_3
changeset 59 8ad140f3dd41
parent 0 a03f92240627
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hti/PC_Tools/HTIGateway/ServicePlugins/HtiApplication/HtiApplication.cpp	Wed Oct 13 16:17:58 2010 +0300
@@ -0,0 +1,818 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+* 
+* Description:
+*/
+#include "HtiApplicationH.h"
+#include "HtiPlugin.h"
+#include "HtiSoapHandlerInterface.h"
+#include "hticommon.h"
+
+// Application control commands
+// NOTE: Only unicode versions of commands are used.
+//const int CMD_HTI_START_PROCESS         = 0x02;
+const int CMD_HTI_START_PROCESS_U         = 0x03;
+//const int CMD_HTI_STATUS_PROCESS        = 0x04;
+const int CMD_HTI_STATUS_PROCESS_U        = 0x05;
+const int CMD_HTI_STATUS_PROCESSID        = 0x06;
+const int CMD_HTI_START_PROCESS_RET_VAL_U = 0x07;
+//const int CMD_HTI_STOP_PROCESS          = 0x08;
+const int CMD_HTI_STOP_PROCESS_U          = 0x09;
+const int CMD_HTI_STOP_PROCESSID          = 0x0A;
+const int CMD_HTI_GET_PROCESS_EXIT_CODE   = 0x0B;
+//const int CMD_HTI_LIST_PROCESSES        = 0x0C;
+const int CMD_HTI_LIST_PROCESSES_U        = 0x0D;
+//const int CMD_HTI_START_PROCESS_RET_VAL = 0x0E;
+//const int CMD_HTI_START_APP             = 0x10;
+const int CMD_HTI_START_APP_U             = 0x11;
+//const int CMD_HTI_START_APP_UID         = 0x12;
+const int CMD_HTI_START_APP_UID_U         = 0x13;
+//const int CMD_HTI_START_DOC             = 0x14;
+const int CMD_HTI_START_DOC_U             = 0x15;
+//const int CMD_HTI_STATUS_APP            = 0x16;
+const int CMD_HTI_STATUS_APP_U            = 0x17;
+//const int CMD_HTI_STATUS_DOC            = 0x18;
+const int CMD_HTI_STATUS_DOC_U            = 0x19;
+const int CMD_HTI_STATUS_APP_UID          = 0x1A;
+//const int CMD_HTI_STOP_APP              = 0x1C;
+const int CMD_HTI_STOP_APP_U              = 0x1D;
+//const int CMD_HTI_STOP_DOC              = 0x1E;
+const int CMD_HTI_STOP_DOC_U              = 0x1F;
+const int CMD_HTI_STOP_APP_UID            = 0x20;
+//const int CMD_HTI_LIST_APPS               = 0x24;
+const int CMD_HTI_LIST_APPS_U             = 0x25;
+
+// Application install commands
+//const int CMD_HTI_INSTALL_SOFTWARE        = 0x30;
+const int CMD_HTI_INSTALL_SOFTWARE_U        = 0x31;
+const int CMD_HTI_UNINSTALL_SOFTWARE        = 0x32;
+const int CMD_HTI_UNINSTALL_SOFTWARE_NAME_U = 0x33;
+//const int CMD_HTI_UNINSTALL_SOFTWARE_NAME   = 0x34;
+
+// Application control response codes
+const int CMD_RESP_OK               = 0xF0;
+const int CMD_RESP_NOT_FOUND        = 0xF1;
+const int CMD_RESP_ALREADY_RUNNING  = 0xF2;
+const int CMD_RESP_ALREADY_STOPPED  = 0xF3;
+const int CMD_RESP_RUNNING          = 0xF4;
+const int CMD_RESP_KILLED           = 0xF5;
+const int CMD_RESP_PANIC            = 0xF6;
+
+//**********************************************************************************
+// HELPER FUNCTIONS
+//
+//**********************************************************************************
+
+//**********************************************************************************
+// ResponseCode2String
+//**********************************************************************************
+char* ResponseCode2String(struct soap* soap, BYTE code)
+{
+    char tmp[50]; // 50 should be more than enough
+
+    switch(code)
+    {
+    case CMD_RESP_OK:               sprintf(tmp, "ok"); break;
+    case CMD_RESP_NOT_FOUND:        sprintf(tmp, "not found"); break;
+    case CMD_RESP_ALREADY_RUNNING:  sprintf(tmp, "already running"); break;
+    case CMD_RESP_ALREADY_STOPPED:  sprintf(tmp, "already stopped"); break;
+    case CMD_RESP_RUNNING:          sprintf(tmp, "running"); break;
+    case CMD_RESP_KILLED:           sprintf(tmp, "killed"); break;
+    case CMD_RESP_PANIC:            sprintf(tmp, "panic"); break;
+    default:                        sprintf(tmp, "unknown response code 0x%02x", code);
+    }
+
+    char* text = (char*) soap_malloc(soap, strlen(tmp)+1); // +1 is for null character
+    memcpy(text, tmp, strlen(tmp)+1);
+    return text;
+}
+
+//**********************************************************************************
+// ExitTypeCode2String
+//**********************************************************************************
+char* ExitTypeCode2String(struct soap* soap, BYTE code)
+{
+    char tmp[50]; // 50 should be more than enough
+
+    switch(code)
+    {
+    case 0:  sprintf(tmp, "killed"); break;
+    case 1:  sprintf(tmp, "terminated"); break;
+    case 2:  sprintf(tmp, "panic"); break;
+    case 3:  sprintf(tmp, "running"); break;
+    default: sprintf(tmp, "unknown exit type code 0x%02x", code);
+    }
+
+    char* text = (char*) soap_malloc(soap, strlen(tmp)+1); // +1 is for null character
+    memcpy(text, tmp, strlen(tmp)+1);
+    return text;
+}
+
+//**********************************************************************************
+// SOAP FUNCTIONS
+//
+//**********************************************************************************
+//**********************************************************************************
+// ns1__startProcess()
+//**********************************************************************************
+int ns1__startProcess(struct soap* soap,
+                      wchar_t *fileName,
+                      wchar_t *args,
+                      struct startProcessResponse &r)
+{
+    // Check parameters
+    if ( check_mandatory_wcstring_parameter( soap, fileName, "fileName" ) )
+        return SOAP_FAULT;
+
+    // Construct & send HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_START_PROCESS_U );
+    msg.AddWCStringWithLengthByte( fileName );
+    msg.AddWCStringWithLengthByte( args );
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_30_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgMinLen( 1 ) )
+        return SOAP_FAULT;
+
+    r._returnstartProcessResult.status = ResponseCode2String( soap, msg.GetByte(0) );
+
+    if( msg.GetByte( 0 ) == CMD_RESP_OK )
+    {
+        // pid only returned if found
+        if ( msg.CheckMsgExactLen( 5 ) )
+            return SOAP_FAULT;
+        r._returnstartProcessResult.pid = msg.GetInt(1);
+    }
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__stopProcess()
+//**********************************************************************************
+int ns1__stopProcess(struct soap* soap,
+                     wchar_t *matchPattern,
+                     char *&result)
+{
+    // Check parameters
+    if ( check_mandatory_wcstring_parameter( soap, matchPattern, "matchPattern" ) )
+        return SOAP_FAULT;
+
+    // Construct & send HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_STOP_PROCESS_U );
+    msg.AddWCStringWithLengthByte( matchPattern );
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_10_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgExactLen( 1 ) )
+        return SOAP_FAULT;
+
+    result = ResponseCode2String( soap, msg.GetByte(0) );
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__stopProcessById()
+//**********************************************************************************
+int ns1__stopProcessById(struct soap* soap,
+                         int pid,
+                         char *&result)
+{
+    // Construct & send HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_STOP_PROCESSID );
+    msg.AddInt( pid );
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_10_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgExactLen( 1 ) )
+        return SOAP_FAULT;
+
+    result = ResponseCode2String( soap, msg.GetByte(0) );
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__getProcessStatus()
+//**********************************************************************************
+int ns1__getProcessStatus(struct soap* soap,
+                          wchar_t *matchPattern,
+                          char* &status)
+{
+    // Check parameters
+    if ( check_mandatory_wcstring_parameter( soap, matchPattern, "matchPattern" ) )
+        return SOAP_FAULT;
+
+    // Construct & send HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_STATUS_PROCESS_U );
+    msg.AddWCStringWithLengthByte( matchPattern );
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_10_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgExactLen( 1 ) )
+        return SOAP_FAULT;
+
+    status = ResponseCode2String( soap, msg.GetByte(0) );
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__getProcessStatusById()
+//**********************************************************************************
+int ns1__getProcessStatusById(struct soap* soap,
+                              int pid,
+                              char* &status)
+{
+    // Construct & send HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_STATUS_PROCESSID );
+    msg.AddInt( pid );
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_10_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgExactLen( 1 ) )
+        return SOAP_FAULT;
+
+    status = ResponseCode2String( soap, msg.GetByte(0) );
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__startApp()
+//**********************************************************************************
+int ns1__startApp(struct soap* soap,
+                  wchar_t *appName,
+                  wchar_t *docName,
+                  struct startAppResponse &r)
+{
+    // Check parameters
+    if ( check_mandatory_wcstring_parameter( soap, appName, "appName" ) )
+        return SOAP_FAULT;
+
+    // Construct & send HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_START_APP_U );
+    msg.AddWCStringWithLengthByte( appName );
+    msg.AddWCStringWithLengthByte( docName );
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_10_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgMinLen( 1 ) )
+        return SOAP_FAULT;
+
+    r._returnstartAppResult.status = ResponseCode2String( soap, msg.GetByte(0) );
+
+    if( msg.GetByte( 0 ) == CMD_RESP_OK )
+    {
+        // threadId only returned if found
+        if ( msg.CheckMsgExactLen( 5 ) )
+            return SOAP_FAULT;
+        r._returnstartAppResult.threadId = msg.GetInt(1);
+    }
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__startAppByUid()
+//**********************************************************************************
+int ns1__startAppByUid(struct soap* soap,
+                       int uid,
+                       wchar_t *docName,
+                       struct startAppByUidResponse &r)
+{
+    // Construct & send HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_START_APP_UID_U );
+    msg.AddInt( uid );
+    msg.AddWCStringWithLengthByte( docName );
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_10_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgMinLen( 1 ) )
+        return SOAP_FAULT;
+
+    r._returnstartAppByUidResult.status = ResponseCode2String( soap, msg.GetByte(0) );
+
+    if( msg.GetByte( 0 ) == CMD_RESP_OK )
+    {
+        // threadId only returned if found
+        if ( msg.CheckMsgExactLen( 5 ) )
+            return SOAP_FAULT;
+        r._returnstartAppByUidResult.threadId = msg.GetInt(1);
+    }
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__startDoc()
+//**********************************************************************************
+int ns1__startDoc(struct soap* soap,
+                  wchar_t *docName,
+                  struct startDocResponse &r)
+{
+    // Check parameters
+    if ( check_mandatory_wcstring_parameter( soap, docName, "docName" ) )
+        return SOAP_FAULT;
+
+    // Construct & send HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_START_DOC_U );
+    msg.AddWCStringWithLengthByte( docName );
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_10_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgMinLen( 1 ) )
+        return SOAP_FAULT;
+
+    r._returnstartDocResult.status = ResponseCode2String( soap, msg.GetByte(0) );
+
+    if( msg.GetByte( 0 ) == CMD_RESP_OK )
+    {
+        // threadId only returned if found
+        if ( msg.CheckMsgExactLen( 5 ) )
+            return SOAP_FAULT;
+        r._returnstartDocResult.threadId = msg.GetInt(1);
+    }
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__getAppStatus()
+//**********************************************************************************
+int ns1__getAppStatus(struct soap* soap,
+                      wchar_t *appName,
+                      char* &status)
+{
+    // Check parameters
+    if ( check_mandatory_wcstring_parameter( soap, appName, "appName" ) )
+        return SOAP_FAULT;
+
+    // Construct & send HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_STATUS_APP_U );
+    msg.AddWCStringWithLengthByte( appName );
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_10_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgExactLen( 1 ) )
+        return SOAP_FAULT;
+
+    status = ResponseCode2String( soap, msg.GetByte(0) );
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__getAppStatusByUid()
+//**********************************************************************************
+int ns1__getAppStatusByUid(struct soap* soap,
+                           int uid,
+                           char* &status)
+{
+    // Construct & send HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_STATUS_APP_UID );
+    msg.AddInt( uid );
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_10_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgExactLen( 1 ) )
+        return SOAP_FAULT;
+
+    status = ResponseCode2String( soap, msg.GetByte(0) );
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__getAppStatusByDoc()
+//**********************************************************************************
+int ns1__getAppStatusByDoc(struct soap* soap,
+                           wchar_t *docName,
+                           char* &status)
+{
+    // Check parameters
+    if ( check_mandatory_wcstring_parameter( soap, docName, "docName" ) )
+        return SOAP_FAULT;
+
+    // Construct & send HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_STATUS_DOC_U );
+    msg.AddWCStringWithLengthByte( docName );
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_10_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgExactLen( 1 ) )
+        return SOAP_FAULT;
+
+    status = ResponseCode2String( soap, msg.GetByte(0) );
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__stopApp()
+//**********************************************************************************
+int ns1__stopApp(struct soap* soap,
+                 wchar_t *appName,
+                 char *&result)
+{
+    // Check parameters
+    if ( check_mandatory_wcstring_parameter( soap, appName, "appName" ) )
+        return SOAP_FAULT;
+
+    // Construct & send HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_STOP_APP_U );
+    msg.AddWCStringWithLengthByte( appName );
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_10_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgExactLen( 1 ) )
+        return SOAP_FAULT;
+
+    result = ResponseCode2String( soap, msg.GetByte(0) );
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__stopAppByUid()
+//**********************************************************************************
+int ns1__stopAppByUid(struct soap* soap,
+                      int uid,
+                      char *&result)
+{
+    // Construct & send HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_STOP_APP_UID );
+    msg.AddInt( uid );
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_10_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgExactLen( 1 ) )
+        return SOAP_FAULT;
+
+    result = ResponseCode2String( soap, msg.GetByte(0) );
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__stopAppByDoc()
+//**********************************************************************************
+int ns1__stopAppByDoc(struct soap* soap,
+                      wchar_t *docName,
+                      char *&result)
+{
+    // Check parameters
+    if ( check_mandatory_wcstring_parameter( soap, docName, "docName" ) )
+        return SOAP_FAULT;
+
+    // Construct & send HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_STOP_DOC_U );
+    msg.AddWCStringWithLengthByte( docName );
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_10_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgExactLen( 1 ) )
+        return SOAP_FAULT;
+
+    result = ResponseCode2String( soap, msg.GetByte(0) );
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__listProcesses()
+//**********************************************************************************
+int ns1__listProcesses(struct soap* soap,
+                       wchar_t *matchPattern,
+                       ArrayOfHtiProcess *HtiProcesses)
+{
+    // Construct & send HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_LIST_PROCESSES_U );
+    msg.AddWCStringWithLengthByte( matchPattern );
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_10_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgMinLen( 1 ) )
+        return SOAP_FAULT;
+
+    if(msg.GetByte(0) != CMD_RESP_OK)
+    {
+        // This sould happen only if message is corrupted somehow...
+        soap->error = soap_receiver_fault_format(soap, "HtiError",
+            "response code error (0x%x)", msg.GetByte(0));
+        return SOAP_FAULT;
+    }
+
+    // Fill & alloc soap stuff
+    HtiProcesses->__size = (int) msg.GetWord(1);
+    HtiProcesses->__ptr = soap_new_ns1__HtiProcess(soap, HtiProcesses->__size);
+
+    // Go through processes
+    int offset = 3;
+    ns1__HtiProcess *process = HtiProcesses->__ptr;
+    for(int i = 0; i < HtiProcesses->__size; i++)
+    {
+        process->processId = msg.GetInt(offset);//pid;
+        process->processStatus = ResponseCode2String(soap, msg.GetByte(offset+4));
+
+        // Get processname
+        char* tmp = (char*) msg.GetMsgBody();
+        tmp += offset+6;
+        int processNameLen = msg.GetByte(offset+5);
+        process->processName = (char*) soap_malloc(soap, processNameLen+1);
+        memcpy(process->processName, tmp, processNameLen);
+        process->processName[processNameLen] = 0x0; //  add null
+
+        // for the next iteration
+        offset += 4+1+1+processNameLen;
+        process++;
+    }
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__startProcessRetVal()
+//**********************************************************************************
+int ns1__startProcessRetVal(struct soap* soap,
+                            wchar_t *fileName,
+                            wchar_t *args,
+                            struct startProcessResponse &r)
+{
+    // Check parameters
+    if ( check_mandatory_wcstring_parameter( soap, fileName, "fileName" ) )
+        return SOAP_FAULT;
+
+    // Construct & send HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_START_PROCESS_RET_VAL_U );
+    msg.AddWCStringWithLengthByte( fileName );
+    msg.AddWCStringWithLengthByte( args );
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_30_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgMinLen( 1 ) )
+        return SOAP_FAULT;
+
+    r._returnstartProcessResult.status = ResponseCode2String( soap, msg.GetByte(0) );
+
+    if( msg.GetByte( 0 ) == CMD_RESP_OK )
+    {
+        // pid only returned if found
+        if ( msg.CheckMsgExactLen( 5 ) )
+            return SOAP_FAULT;
+        r._returnstartProcessResult.pid = msg.GetInt(1);
+    }
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__getProcessExitCode()
+//**********************************************************************************
+int ns1__getProcessExitCode(struct soap* soap,
+                            int pid,
+                            struct getProcessExitCodeResponse &r)
+{
+    // Construct & send HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_GET_PROCESS_EXIT_CODE );
+    msg.AddInt( pid );
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_10_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgMinLen( 7 ) )
+        return SOAP_FAULT;
+    if ( msg.GetByte( 0 ) != CMD_RESP_OK )
+        return SOAP_FAULT;
+
+    r._returngetProcessExitCodeResult.exitType = ExitTypeCode2String( soap, msg.GetByte( 1 ) );
+    r._returngetProcessExitCodeResult.exitReason = msg.GetInt( 2 );
+    r._returngetProcessExitCodeResult.exitCategory = msg.GetSoapString( 7, (int) msg.GetByte( 6 ) );
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__installSoftware()
+//**********************************************************************************
+int ns1__installSoftware(struct soap* soap,
+                         wchar_t *installPackagePath,
+                         bool upgrade,
+                         bool optionalItems,
+                         bool ocsp,
+                         bool ignoreOCSPWarnings,
+                         bool installUntrusted,
+                         bool allowPackageInfo,
+                         bool grantUserCapabilities,
+                         bool killApp,
+                         bool overwrite,
+                         bool download,
+                         wchar_t *username,
+                         wchar_t *password,
+                         char *drive,
+                         unsigned char language,
+                         bool usePhoneLanguage,
+                         bool upgradeData,
+                         struct ns1__installSoftwareResponse *out)
+{
+    // Check parameters
+    if ( check_mandatory_wcstring_parameter(
+             soap, installPackagePath, "installPackagePath" ) )
+        return SOAP_FAULT;
+    if ( check_mandatory_string_parameter( soap, drive, "drive" ) )
+        return SOAP_FAULT;
+
+    // Construct HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_INSTALL_SOFTWARE_U );
+    msg.AddWCStringWithLengthByte( installPackagePath );
+    msg.AddByte( upgrade );
+    msg.AddByte( optionalItems );
+    msg.AddByte( ocsp );
+    msg.AddByte( ignoreOCSPWarnings );
+    msg.AddByte( installUntrusted );
+    msg.AddByte( allowPackageInfo );
+    msg.AddByte( grantUserCapabilities );
+    msg.AddByte( killApp );
+    msg.AddByte( overwrite );
+    msg.AddByte( download );
+    msg.AddWCStringWithLengthByteZero( username );
+    msg.AddWCStringWithLengthByteZero( password );
+    msg.AddString( drive );
+    msg.AddByte( language );
+    msg.AddByte( usePhoneLanguage );
+    msg.AddByte( upgradeData );
+
+    // Send message
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_60_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgExactLen( 1 ) != SOAP_OK )
+        return SOAP_FAULT;
+    if ( msg.GetByte( 0 ) != CMD_RESP_OK )
+        return SOAP_FAULT;
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__uninstallSoftware()
+//**********************************************************************************
+int ns1__uninstallSoftware(struct soap* soap,
+                           int uid,
+                           bool killApp,
+                           bool breakDependency,
+                           enum ns1__mimeType  mimeType,
+                           struct ns1__uninstallSoftwareResponse *out)
+{
+    // Construct HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_UNINSTALL_SOFTWARE );
+    msg.AddInt( uid );
+    msg.AddByte( killApp );
+    msg.AddByte( breakDependency );
+    msg.AddByte( mimeType );
+
+    // Send message
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_60_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgExactLen( 1 ) != SOAP_OK )
+        return SOAP_FAULT;
+    if ( msg.GetByte( 0 ) != CMD_RESP_OK )
+        return SOAP_FAULT;
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__uninstallSoftwareByName()
+//**********************************************************************************
+int ns1__uninstallSoftwareByName(struct soap* soap,
+                                 wchar_t *packageName,
+                                 bool killApp,
+                                 bool breakDependency,
+                                 enum ns1__mimeType  mimeType,
+                                 struct ns1__uninstallSoftwareByNameResponse *out)
+{
+    if ( check_mandatory_wcstring_parameter(
+             soap, packageName, "packageName" ) )
+        return SOAP_FAULT;
+
+    // Construct HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_UNINSTALL_SOFTWARE_NAME_U );
+    msg.AddWCStringWithLengthByte( packageName );
+    msg.AddByte( killApp );
+    msg.AddByte( breakDependency );
+    msg.AddByte( mimeType );
+
+    // Send message
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_60_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgExactLen( 1 ) != SOAP_OK )
+        return SOAP_FAULT;
+    if ( msg.GetByte( 0 ) != CMD_RESP_OK )
+        return SOAP_FAULT;
+
+    return SOAP_OK;
+}
+
+//**********************************************************************************
+// ns1__listRunningApps()
+//**********************************************************************************
+int ns1__listRunningApps(struct soap* soap,
+                         bool includeHidden,
+                         bool includeSystem,
+                         ArrayOfHtiRunningApp *htiApps)
+{
+    // Construct & send HTI message
+    HtiMsgHelper msg( soap, HTI_APPLICATION_UID, CMD_HTI_LIST_APPS_U );
+    msg.AddByte( includeHidden );
+    msg.AddByte( includeSystem );
+    if ( msg.SendReceiveMsg( HTIMSG_TIMEOUT_10_SECONDS ) )
+        return SOAP_FAULT;
+
+    // Check response
+    if ( msg.CheckMsgMinLen( 3 ) )
+        return SOAP_FAULT;
+
+    if ( msg.GetByte(0) != CMD_RESP_OK )
+    {
+        // This sould happen only if message is corrupted somehow...
+        soap->error = soap_receiver_fault_format(soap, "HtiError",
+            "response code error (0x%x)", msg.GetByte(0));
+        return SOAP_FAULT;
+    }
+
+    // Fill & alloc soap stuff
+    htiApps->__size = (int) msg.GetWord( 1 );
+    htiApps->__ptr = soap_new_ns1__HtiRunningApp( soap, htiApps->__size );
+
+    // Go through apps
+    int offset = 3;
+    ns1__HtiRunningApp *app = htiApps->__ptr;
+    for ( int i = 0; i < htiApps->__size; i++ )
+    {
+        // App UID
+        app->uid = msg.GetInt( offset );
+        offset += 4;
+
+        // Caption
+        int captionLen = msg.GetByte( offset );
+        offset++;
+        app->caption = msg.GetSoapWCString( offset, captionLen );
+        offset += captionLen * 2;
+
+        // Document name
+        int docLen = msg.GetByte( offset );
+        offset++;
+        app->document = msg.GetSoapWCString( offset, docLen );
+        offset += docLen * 2;
+
+        // Flags
+        app->hidden = msg.GetByte( offset );
+        offset++;
+        app->system = msg.GetByte( offset );
+        offset++;
+        app->ready = msg.GetByte( offset );
+        offset++;
+        app->busy = msg.GetByte( offset );
+        offset++;
+        app->closable = msg.GetByte( offset );
+        offset++;   
+
+        // Advance the array pointer for the next iteration
+        app++;
+    }
+
+    return SOAP_OK;
+}
\ No newline at end of file