1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef DM_UA_TYPEDEFS_H
18#define DM_UA_TYPEDEFS_H
19
20/*==================================================================================================
21
22    Header Name: dm_ua_typedefs.h
23
24    General Description: This contains DMUA data type definitions.
25
26==================================================================================================*/
27
28#include "syncml_dm_data_types.h"
29#include "smldtd.h"
30#include "dmbuffer.h"
31#include "dm_tree_class.H"
32
33/*==================================================================================================
34                                 CONSTANTS
35==================================================================================================*/
36
37#define UINT16_TYPE_STR_SIZE_5    6       /* Array size for coverting a UINT16 number to a string */
38#define UINT32_TYPE_STR_SIZE_10   11      /* Array size for coverting a UINT32 number to a string */
39
40#define NUMBER_OF_WORKSPACE      2                          /* Number of workspace for a session */
41#define WORKSPACE_NAME_LEN        30      /* String length of workspace name */
42#define MAX_BIN_NONCE_LEN         50      /* Maximum length of a binary decoded Nonce */
43#define MAX_BIN_VAL_LEN              50     /* Max length of a b64 decode bin array */
44
45#define DEFAULT_MESSAGE_ID   "1"
46#define DEFAULT_HDR_CMD_ID   "0"
47
48#define SERVER_RESYNC_NONCE  "AAAAAA=="  // Motorola, <e50324>, <12/08/09>, <ikmap-2156> / Nonce Resynchronization
49//#define SERVER_RESYNC_NONCE  "MTIzNDU="  // for Sprint HFA OMA DM
50
51/*==================================================================================================
52                                 ENUMS
53==================================================================================================*/
54/* These enums are used when handling the AppNotify messages.*/
55enum
56{
57    SYNCML_DM_NODE_ADD,
58    SYNCML_DM_NODE_DELETE,
59    SYNCML_DM_NODE_RENAME,
60    SYNCML_DM_NODE_INVALID
61};
62typedef UINT8 SYNCML_DM_NODE_CHANGE_T;
63
64/* These enums are used for the various Challenge types.*/
65enum
66{
67    SYNCML_DM_CHAL_UNDEFINED = -1,
68    SYNCML_DM_CHAL_NONE = 0,
69    SYNCML_DM_CHAL_BASIC = 1,
70    SYNCML_DM_CHAL_MD5 = 2,
71    SYNCML_DM_CHAL_HMAC = 3
72};
73typedef INT8 SYNCML_DM_CHAL_TYPE_T;
74
75/* Type Defines */
76enum {
77    DM_COMMAND_INVALID = 0,
78    DM_COMMAND_ADD,
79    DM_COMMAND_ALERT,
80    DM_COMMAND_ATOMIC_START,
81    DM_COMMAND_ATOMIC_END,
82    DM_COMMAND_COPY,
83    DM_COMMAND_DELETE,
84    DM_COMMAND_EXEC,
85    DM_COMMAND_GET,
86    DM_COMMAND_MAP,
87    DM_COMMAND_PUT,
88    DM_COMMAND_RESULTS,
89    DM_COMMAND_SEARCH,
90    DM_COMMAND_SEQUENCE_START,
91    DM_COMMAND_SEQUENCE_END,
92    DM_COMMAND_STATUS,
93    DM_COMMAND_SYNC_START,
94    DM_COMMAND_SYNC_END,
95    DM_COMMAND_REPLACE,
96    DM_COMMAND_HEADER,
97    DM_COMMAND_BODY_END,
98    DM_COMMAND_COUNT
99};
100typedef UINT8 DMCommandType;
101
102/*==================================================================================================
103                                 TYPEDEFS
104==================================================================================================*/
105
106/* This structure is used to hold credential information. */
107class DMCredHeaders
108{
109public:
110    inline void clear()
111    {
112      m_oAlgorithm.clear();
113      m_oUserName.clear();
114      m_oMac.clear();
115    }
116
117    inline BOOLEAN empty() const
118    {
119       return ( (m_oUserName.getSize() == 0 || m_oMac.getSize() == 0) ? TRUE : FALSE );
120    }
121
122    inline BOOLEAN isCorrect() const
123    {
124        if ( m_oUserName.getSize() != 0 )
125        {
126            if ( m_oMac.getSize() == 0 )
127                return FALSE;
128        }
129        else
130        {
131            if ( m_oMac.getSize() != 0 )
132                return FALSE;
133        }
134        return TRUE;
135    }
136
137    DMBuffer m_oAlgorithm;
138    DMBuffer m_oUserName;
139    DMBuffer m_oMac;
140};
141
142
143
144typedef struct
145{
146   UINT8   *pChalType;
147   UINT8   *pChalFormat;
148   UINT8   *pChalNonce;
149} DM_CHALLENGE_T;
150
151
152/* Added for Multiple Messages Support */
153struct SYNCML_DM_STATUS_DATA_T
154{
155    DMString      pCmdId;
156    DMString      pCmdName;
157    DMString      pSource;
158    DMString      pTarget;
159    SYNCML_DM_RET_STATUS_T status;
160    DMStringVector    responses;  // alert requires additional parameters
161    BOOLEAN       bValueSet;
162    BOOLEAN       bInSequence;
163
164  SYNCML_DM_STATUS_DATA_T() { status = 0; bValueSet = FALSE; bInSequence = FALSE;}
165  SYNCML_DM_STATUS_DATA_T( const char* szCmd, const char* szCmdName, const char* szSource,
166    const char* szTarget, SYNCML_DM_RET_STATUS_T st, DMStringVector* pAdditionalData = NULL ){
167      pCmdId = szCmd;
168      pCmdName = szCmdName;
169      pSource = szSource;
170      pTarget = szTarget;
171      status = st;
172      bValueSet = TRUE;
173      bInSequence = FALSE;
174
175      if ( pAdditionalData )
176        responses = *pAdditionalData;
177    }
178};
179
180struct SYNCML_DM_RESULT_VALUE {
181  enum {Enum_Result_Get, Enum_Result_GetStruct, Enum_Result_GetStructData, Enum_Result_GetTnds, Enum_Result_Exec};
182
183  SmlResultsPtr_t _pGetExecResult;
184  SYNCML_DM_GET_ON_LIST_RET_DATA_T  _oGetStructPos;  // cached position for GetStruct
185  UINT8  _type; // see enum above
186  DMString _cmdRef;
187  DMString _msgID;
188
189  // methods
190  inline SYNCML_DM_RESULT_VALUE()
191    {
192    _type = 0; _pGetExecResult = NULL;
193    }
194  inline SYNCML_DM_RESULT_VALUE( UINT8 type, SmlResultsPtr_t pRes, const SYNCML_DM_GET_ON_LIST_RET_DATA_T& oData, const char* strCmdRef, const char* strMsgID ){
195    _type = type;
196    _oGetStructPos = oData;
197    _pGetExecResult = pRes;
198    _cmdRef = strCmdRef;
199    _msgID = strMsgID;
200    }
201};
202
203
204class DMProcessScriptSession;
205class SYNCML_DM_BuildPackage;
206
207struct SYNCML_DM_USER_DATA_T
208{
209  enum {Enum_Alert_None, Enum_Alert_Cancel, Enum_Alert_No};
210
211  // saved statuses
212  DMVector<UINT32>  aStatuses;
213  DMVector<SYNCML_DM_RESULT_VALUE> aResults;
214
215  DMString              pMsgRef;
216  SYNCML_DM_STATUS_DATA_T pAtomicStatus;  // atomic command state
217  DMVector<SYNCML_DM_STATUS_DATA_T> oStatus;  // atomic statuses (not built)
218  BOOLEAN               rollback;   // inside atomic and already rolled back
219  BOOLEAN               sequenceFailed;
220  SYNCML_DM_ALERT_RES_T  alertState; // alert state in atomic/sequence/document -
221  BOOLEAN               bNonceGenerated;
222  DMProcessScriptSession *pSessionMng;
223  SYNCML_DM_BuildPackage * pPkgBuilder;
224
225
226  inline SYNCML_DM_USER_DATA_T() {
227      rollback        = FALSE;
228      sequenceFailed  = FALSE;
229      bNonceGenerated = FALSE;
230      pMsgRef = NULL;
231      alertState = SYNCML_DM_ALERT_NONE;
232      pSessionMng = NULL;
233      pPkgBuilder = NULL;
234    }
235
236  inline bool IsCommandSkipped() const
237  {
238    return ( alertState == SYNCML_DM_ALERT_CANCEL ||
239             ( ((pAtomicStatus.bValueSet || pAtomicStatus.bInSequence) &&
240                (rollback || alertState == SYNCML_DM_ALERT_NO)) ||
241                (pAtomicStatus.bInSequence && sequenceFailed)));
242  }
243  inline void EndAtomic() {
244    pAtomicStatus.bValueSet = FALSE;
245    rollback = FALSE;
246    oStatus.clear();
247
248    if ( alertState != SYNCML_DM_ALERT_CANCEL )
249      alertState = SYNCML_DM_ALERT_NONE;
250  }
251
252  inline BOOLEAN IsSequence()
253    {
254      return pAtomicStatus.bInSequence;
255    }
256
257  inline void StartSequence()
258    {
259      pAtomicStatus.bInSequence = TRUE;
260    }
261  inline void EndSequence()
262    {
263      pAtomicStatus.bInSequence = FALSE;
264      sequenceFailed = FALSE;
265
266      if ( alertState != Enum_Alert_Cancel )
267        alertState = Enum_Alert_None;
268    }
269};
270
271#endif /* DM_UA_TYPEDEFS_H */
272