#include <emem.h> not req'd
[obnox/wireshark/wip.git] / epan / dissectors / packet-starteam.c
1 /* packet-starteam.c
2  * Routines for Borland StarTeam packet dissection
3  *
4  * metatech <metatech@flashmail.com>
5  *
6  * $Id$
7  *
8  * Wireshark - Network traffic analyzer
9  * By Gerald Combs <gerald@wireshark.org>
10  * Copyright 1998 Gerald Combs
11  *
12  * This program is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU General Public License
14  * as published by the Free Software Foundation; either version 2
15  * of the License, or (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
25  */
26
27 /*  StarTeam in a nutshell
28 *
29 *   StarTeam is a Software Change & Configuration Management Tool (like CVS) 
30 */
31
32 #ifdef HAVE_CONFIG_H
33 # include "config.h"
34 #endif
35
36 #include <string.h>
37
38 #include <glib.h>
39 #include <epan/packet.h>
40 #include <epan/conversation.h>
41 #include <epan/prefs.h>
42 #include "packet-tcp.h"
43
44 static int proto_starteam = -1;
45
46 static int hf_starteam_mdh_session_tag = -1;
47 static int hf_starteam_mdh_ctimestamp = -1;
48 static int hf_starteam_mdh_flags = -1;
49 static int hf_starteam_mdh_keyid = -1;
50 static int hf_starteam_mdh_reserved = -1;
51 static int hf_starteam_ph_signature = -1;
52 static int hf_starteam_ph_packet_size = -1;
53 static int hf_starteam_ph_data_size = -1;
54 static int hf_starteam_ph_data_flags = -1;
55 static int hf_starteam_id_revision_level = -1;
56 static int hf_starteam_id_client = -1;
57 static int hf_starteam_id_connect = -1;
58 static int hf_starteam_id_component = -1;
59 static int hf_starteam_id_command = -1;
60 static int hf_starteam_id_command_time = -1;
61 static int hf_starteam_id_command_userid = -1;
62 static int hf_starteam_data_data = -1;
63
64 static gint ett_starteam = -1;
65 static gint ett_starteam_mdh = -1;
66 static gint ett_starteam_ph = -1;
67 static gint ett_starteam_id = -1;
68 static gint ett_starteam_data = -1;
69
70 static dissector_handle_t starteam_tcp_handle;
71
72 static gboolean starteam_desegment = TRUE;
73
74 #define STARTEAM_MAGIC    0x416C616E /* "Alan" */
75
76 #define STARTEAM_SRVR_CMD_GET_SESSION_TAG                      1
77 #define STARTEAM_SRVR_CMD_GET_REQUIRED_ENCRYPTION_LEVEL        2
78 #define STARTEAM_SRVR_CMD_GET_SERVER_PARAMS                    3
79 #define STARTEAM_SRVR_CMD_SERVER_CONNECT                       4
80 #define STARTEAM_SRVR_CMD_SERVER_RECONNECT                     5
81 #define STARTEAM_SRVR_CMD_BEGIN_LOGIN                          10
82 #define STARTEAM_SRVR_CMD_KEY_EXCHANGE_PHASE0                  11
83 #define STARTEAM_SRVR_CMD_KEY_EXCHANGE_PHASE12                 12
84 #define STARTEAM_SRVR_CMD_KEY_EXCHANGE_PHASE3                  13
85 #define STARTEAM_SRVR_CMD_SERVER_LOGIN                         14
86 #define STARTEAM_SRVR_CMD_GET_PROJECT_LIST                     1001
87 #define STARTEAM_SRVR_CMD_GET_PROJECT_VIEWS                    1002
88 #define STARTEAM_SRVR_CMD_PROJECT_LOGIN                        1011
89 #define STARTEAM_SRVR_CMD_PROJECT_LOGOUT                       1013
90 #define STARTEAM_PROJ_CMD_LIST_SET_READ                        1014
91 #define STARTEAM_PROJ_CMD_LIST_ADD_ATTACHMENT                  1015
92 #define STARTEAM_PROJ_CMD_LIST_GET_ATTACHMENT                  1016
93 #define STARTEAM_PROJ_CMD_LIST_REMOVE_ATTACHMENT               1017
94 #define STARTEAM_PROJ_CMD_MAIL_LIST_ITEMS                      1018
95 #define STARTEAM_PROJ_CMD_LIST_ANY_NEWITEMS                    1020
96 #define STARTEAM_PROJ_CMD_LIST_GET_NEWITEMS                    1021
97 #define STARTEAM_SRVR_CMD_RELEASE_CLIENT                       1021
98 #define STARTEAM_SRVR_CMD_UPDATE_SERVER_INFO                   1022
99 #define STARTEAM_SRVR_CMD_GET_USAGE_DATA                       1023
100 #define STARTEAM_SRVR_CMD_GET_LICENSE_INFO                     1024
101 #define STARTEAM_PROJ_CMD_FILTER_ADD                           1030
102 #define STARTEAM_PROJ_CMD_FILTER_MODIFY                        1031
103 #define STARTEAM_PROJ_CMD_FILTER_GET                           1032
104 #define STARTEAM_PROJ_CMD_FILTER_GET_LIST                      1033
105 #define STARTEAM_PROJ_CMD_FILTER_DELETE                        1034
106 #define STARTEAM_PROJ_CMD_QUERY_ADD                            1035
107 #define STARTEAM_PROJ_CMD_QUERY_MODIFY                         1036
108 #define STARTEAM_PROJ_CMD_QUERY_GET                            1037
109 #define STARTEAM_PROJ_CMD_QUERY_GET_LIST                       1038
110 #define STARTEAM_PROJ_CMD_QUERY_DELETE                         1039
111 #define STARTEAM_PROJ_GET_FILTER_CLASS_ID                      1040
112 #define STARTEAM_PROJ_GET_QUERY_CLASS_ID                       1041
113 #define STARTEAM_SRVR_CMD_PROJECT_CREATE                       1051
114 #define STARTEAM_SRVR_CMD_PROJECT_OPEN                         1052
115 #define STARTEAM_SRVR_CMD_PROJECT_CLOSE                        1053
116 #define STARTEAM_PROJ_CMD_CATALOG_LOADALL                      1151
117 #define STARTEAM_PROJ_CMD_CATALOG_LOADSET                      1152
118 #define STARTEAM_PROJ_CMD_CATALOG_LOADREGISTEREDCLASSES        1154
119 #define STARTEAM_PROJ_CMD_REFRESH_CLASS_INFO                   1160
120 #define STARTEAM_PROJ_CMD_ADD_CUSTOM_FIELD_CLASS_INFO          1161
121 #define STARTEAM_PROJ_CMD_MODIFY_FIELD_CLASS_INFO              1162
122 #define STARTEAM_PROJ_CMD_ADD_CUSTOM_FIELD_CLASS_INFO_EX       1163
123 #define STARTEAM_PROJ_CMD_GET_FOLDER_ITEMS                     2001
124 #define STARTEAM_SRVR_CMD_GET_USERS_AND_GROUPS                 2001
125 #define STARTEAM_PROJ_CMD_REFRESH_ITEMS                        2002
126 #define STARTEAM_PROJ_CMD_GET_ITEM                             2003
127 #define STARTEAM_SRVR_CMD_GET_EMAIL_USERS                      2003
128 #define STARTEAM_PROJ_CMD_UPDATE_ITEM                          2004
129 #define STARTEAM_PROJ_CMD_DELETE_ITEM                          2005
130 #define STARTEAM_PROJ_CMD_SET_ITEM_LOCK                        2006
131 #define STARTEAM_PROJ_CMD_DELETE_TREE_ITEM                     2007
132 #define STARTEAM_PROJ_CMD_GET_ITEM_HISTORY                     2010
133 #define STARTEAM_SRVR_CMD_GET_USER_PERSONAL_INFO               2011
134 #define STARTEAM_SRVR_CMD_SET_USER_PERSONAL_INFO               2012
135 #define STARTEAM_SRVR_CMD_SET_USER_PASSWORD                    2013
136 #define STARTEAM_PROJ_CMD_MOVE_ITEMS                           2020
137 #define STARTEAM_PROJ_CMD_MOVE_TREE_ITEMS                      2021
138 #define STARTEAM_SRVR_CMD_GET_GROUP_INFO                       2021
139 #define STARTEAM_PROJ_CMD_SHARE_ITEMS                          2022
140 #define STARTEAM_SRVR_CMD_ADD_EDIT_GROUP_INFO                  2022
141 #define STARTEAM_PROJ_CMD_SHARE_TREE_ITEMS                     2023
142 #define STARTEAM_SRVR_CMD_DROP_GROUP                           2023
143 #define STARTEAM_SRVR_CMD_GET_USER_INFO                        2024
144 #define STARTEAM_SRVR_CMD_ADD_EDIT_USER_INFO                   2025
145 #define STARTEAM_SRVR_CMD_DROP_USER                            2026
146 #define STARTEAM_SRVR_CMD_GET_MIN_PASSWORD_LENGTH              2027
147 #define STARTEAM_SRVR_CMD_USER_ADMIN_OPERATION                 2028
148 #define STARTEAM_SRVR_CMD_ACCESS_CHECK                         2029
149 #define STARTEAM_PROJ_CMD_GET_COMMON_ANCESTOR_ITEM             2030
150 #define STARTEAM_SRVR_CMD_ACCESS_TEST                          2030
151 #define STARTEAM_PROJ_CMD_UPDATE_REVISION_COMMENT              2031
152 #define STARTEAM_SRVR_CMD_GET_MAIN_LOG_LAST64K                 2031
153 #define STARTEAM_SRVR_CMD_GET_SERVER_CONFIG                    2032
154 #define STARTEAM_SRVR_CMD_SET_SERVER_CONFIG                    2033
155 #define STARTEAM_SRVR_CMD_GET_SERVER_ACL                       2034
156 #define STARTEAM_SRVR_CMD_DROP_SERVER_ACL                      2035
157 #define STARTEAM_SRVR_CMD_SET_SERVER_ACL                       2036
158 #define STARTEAM_SRVR_CMD_GET_SYSTEM_POLICY                    2037
159 #define STARTEAM_SRVR_CMD_SET_SYSTEM_POLICY                    2038
160 #define STARTEAM_SRVR_CMD_GET_SECURITY_LOG                     2039
161 #define STARTEAM_SRVR_CMD_GET_SERVER_COMMAND_STATS             2040
162 #define STARTEAM_SRVR_CMD_SET_SERVER_COMMAND_MODE              2041
163 #define STARTEAM_SRVR_CMD_SHUTDOWN                             2042
164 #define STARTEAM_SRVR_CMD_RESTART                              2043
165 #define STARTEAM_SRVR_CMD_GET_SERVER_COMMAND_MODE              2045
166 #define STARTEAM_SRVR_CMD_GET_LOG                              2046
167 #define STARTEAM_SRVR_CMD_GET_COMPONENT_LIST                   2050
168 #define STARTEAM_SRVR_CMD_GET_GROUP_MEMBERS                    2060
169 #define STARTEAM_PROJ_CMD_GET_ITEMS_VERSIONS                   5001
170 #define STARTEAM_SRVR_CMD_VALIDATE_VSS_INI_PATH                9034
171 #define STARTEAM_SRVR_CMD_VALIDATE_PVCS_CFG_PATH               9035
172 #define STARTEAM_SRVR_CMD_GET_VSS_PROJECT_TREE                 9036
173 #define STARTEAM_SRVR_CMD_GET_ALL_PVCS_ARCHIVES                9037
174 #define STARTEAM_SRVR_CMD_INITIALIZE_FOREIGN_ACCESS            9038
175 #define STARTEAM_SRVR_CMD_SET_FOREIGN_PROJECT_PW               9039
176 #define STARTEAM_PROJ_CMD_PING                                 10001
177 #define STARTEAM_PROJ_CMD_SET_LOCALE                           10005
178 #define STARTEAM_PROJ_CMD_GET_CONTAINER_ACL                    10011
179 #define STARTEAM_PROJ_CMD_SET_CONTAINER_ACL                    10012
180 #define STARTEAM_PROJ_CMD_GET_CONTAINER_LEVEL_ACL              10013
181 #define STARTEAM_PROJ_CMD_SET_CONTAINER_LEVEL_ACL              10014
182 #define STARTEAM_PROJ_CMD_GET_OBJECT_ACL                       10015
183 #define STARTEAM_PROJ_CMD_SET_OBJECT_ACL                       10016
184 #define STARTEAM_PROJ_CMD_ITEM_ACCESS_CHECK                    10017
185 #define STARTEAM_PROJ_CMD_ITEM_ACCESS_TEST                     10018
186 #define STARTEAM_PROJ_CMD_GET_OWNER                            10019
187 #define STARTEAM_PROJ_CMD_ACQUIRE_OWNERSHIP                    10020
188 #define STARTEAM_PROJ_CMD_GET_FOLDERS                          10021
189 #define STARTEAM_PROJ_CMD_ADD_FOLDERS                          10023
190 #define STARTEAM_PROJ_CMD_DELETE_FOLDER                        10024
191 #define STARTEAM_PROJ_CMD_MOVE_FOLDER                          10025
192 #define STARTEAM_PROJ_CMD_SHARE_FOLDER                         10026
193 #define STARTEAM_PROJ_CMD_CONTAINER_ACCESS_CHECK               10031
194 #define STARTEAM_PROJ_CMD_CONTAINER_ACCESS_TEST                10032
195 #define STARTEAM_PROJ_CMD_GET_OBJECT2_ACL                      10035
196 #define STARTEAM_PROJ_CMD_SET_OBJECT2_ACL                      10036
197 #define STARTEAM_PROJ_CMD_OBJECT_ACCESS_CHECK                  10037
198 #define STARTEAM_PROJ_CMD_OBJECT_ACCESS_TEST                   10038
199 #define STARTEAM_PROJ_CMD_GET_OBJECT_OWNER                     10039
200 #define STARTEAM_PROJ_CMD_ACQUIRE_OBJECT_OWNERSHIP             10040
201 #define STARTEAM_PROJ_CMD_GET_FOLDER_PROPERTIES                10053
202 #define STARTEAM_PROJ_CMD_SET_FOLDER_PROPERTIES                10054
203 #define STARTEAM_PROJ_CMD_GET_ITEM_PROPERTIES                  10060
204 #define STARTEAM_PROJ_CMD_SET_ITEM_PROPERTIES                  10061
205 #define STARTEAM_PROJ_CMD_GET_ITEM_REFERENCES                  10062
206 #define STARTEAM_PROJ_CMD_GET_ITEM_REFERENCE                   10063
207 #define STARTEAM_PROJ_CMD_GET_ITEM_REVISIONS                   10065
208 #define STARTEAM_PROJ_CMD_DELETE_PROJECT                       10083
209 #define STARTEAM_PROJ_CMD_GET_PROJECT_PROPERTIES               10085
210 #define STARTEAM_PROJ_CMD_SET_PROJECT_PROPERTIES               10086
211 #define STARTEAM_PROJ_CMD_GET_VIEW_INFO                        10090
212 #define STARTEAM_PROJ_CMD_ADD_VIEW                             10091
213 #define STARTEAM_PROJ_CMD_GET_VIEWS                            10092
214 #define STARTEAM_PROJ_CMD_GET_VIEW_PROPERTIES                  10093
215 #define STARTEAM_PROJ_CMD_SET_VIEW_PROPERTIES                  10094
216 #define STARTEAM_PROJ_CMD_DELETE_VIEW                          10095
217 #define STARTEAM_PROJ_CMD_SWITCH_VIEW                          10098
218 #define STARTEAM_PROJ_CMD_SWITCH_VIEW_CONFIG                   10099
219 #define STARTEAM_PROJ_CMD_GET_FOLDER_PATH                      10100
220 #define STARTEAM_FILE_CMD_CHECKOUT                             10104
221 #define STARTEAM_FILE_CMD_GET_SYNC_INFO                        10111
222 #define STARTEAM_FILE_CMD_DELETE_SYNC_INFO                     10112
223 #define STARTEAM_FILE_CMD_GET_PATH_IDS                         10117
224 #define STARTEAM_FILE_CMD_SYNC_UPDATE_ALL_INFO                 10119
225 #define STARTEAM_FILE_CMD_RESYNC_FILE                          10121
226 #define STARTEAM_FILE_CMD_CONVERT_ARCHIVE                      10122
227 #define STARTEAM_FILE_CMD_ARCHIVE_CONVERSION                   10123
228 #define STARTEAM_FILE_CMD_READ_PVCS_ARCHIVES                   10130
229 #define STARTEAM_FILE_CMD_ADD_PVCS_ARCHIVES                    10131
230 #define STARTEAM_FILE_CMD_ADD_PVCS_BRANCHES                    10132
231 #define STARTEAM_FILE_CMD_FINISH_NEW_PVCS_PROJECT              10133
232 #define STARTEAM_FILE_CMD_GET_NUMBER_VSS_ARCHIVES              10134
233 #define STARTEAM_FILE_CMD_READ_VSS_ARCHIVES                    10135
234 #define STARTEAM_FILE_CMD_ADD_VSS_ARCHIVE_TO_FOLDER            10136
235 #define STARTEAM_FILE_CMD_FINISH_NEW_VSS_PROJECT               10137
236 #define STARTEAM_FILE_CMD_REFRESH_FOREIGN_FOLDER               10138
237 #define STARTEAM_FILE_CMD_START_GO_NATIVE                      10139
238 #define STARTEAM_FILE_CMD_GET_PROJECT_TYPE                     10141
239 #define STARTEAM_FILE_CMD_SET_FOREIGN_PROJECT_PW               10142
240 #define STARTEAM_FILE_CMD_INTERNAL_NESTED_COMMAND              10143
241 #define STARTEAM_PROJ_CMD_LABEL_GET_INFO                       10201
242 #define STARTEAM_PROJ_CMD_LABEL_GET_PROPERTIES                 10202
243 #define STARTEAM_PROJ_CMD_LABEL_SET_PROPERTIES                 10203
244 #define STARTEAM_PROJ_CMD_LABEL_CREATE                         10205
245 #define STARTEAM_PROJ_CMD_LABEL_DELETE                         10206
246 #define STARTEAM_PROJ_CMD_LABEL_ATTACH                         10207
247 #define STARTEAM_PROJ_CMD_LABEL_MOVE                           10208
248 #define STARTEAM_PROJ_CMD_LABEL_DETACH                         10209
249 #define STARTEAM_PROJ_CMD_LABEL_GET_INFO_EX                    10221
250 #define STARTEAM_PROJ_CMD_LABEL_CREATE_EX                      10222
251 #define STARTEAM_PROJ_CMD_LABEL_ATTACH_EX                      10223
252 #define STARTEAM_PROJ_CMD_LABEL_ATTACH_ITEMS                   10224
253 #define STARTEAM_PROJ_CMD_LABEL_DETACH_EX                      10225
254 #define STARTEAM_PROJ_CMD_LABEL_DETACH_ITEMS                   10226
255 #define STARTEAM_PROJ_CMD_LABEL_GETITEMIDS                     10229
256 #define STARTEAM_PROJ_CMD_LINK_GET_INFO                        10300
257 #define STARTEAM_PROJ_CMD_LINK_CREATE                          10301
258 #define STARTEAM_PROJ_CMD_LINK_DELETE                          10302
259 #define STARTEAM_PROJ_CMD_LINK_UPDATE_PROPERTIES               10310
260 #define STARTEAM_PROJ_CMD_LINK_UPDATE_PINS                     10311
261 #define STARTEAM_PROJ_CMD_PROMOTION_GET                        10400
262 #define STARTEAM_PROJ_CMD_PROMOTION_SET                        10401
263 #define STARTEAM_TASK_CMD_GET_WORKRECS                         10402
264 #define STARTEAM_TASK_CMD_ADD_WORKREC                          10403
265 #define STARTEAM_TASK_CMD_UPDATE_WORKREC                       10404
266 #define STARTEAM_TASK_CMD_DELETE_WORKREC                       10405
267 #define STARTEAM_TASK_CMD_DELETE_TASK_PREDECESSOR              10408
268 #define STARTEAM_TASK_CMD_GET_TASK_DEPENDENCIES                10409
269 #define STARTEAM_TASK_CMD_ADD_TASK_PREDECESSOR                 10410
270 #define STARTEAM_TASK_CMD_UPDATE_TASK_PREDECESSOR              10411
271 #define STARTEAM_PROJ_CMD_VIEW_COMPARE_GET_FOLDER_DETAILS      20070
272 #define STARTEAM_PROJ_CMD_VIEW_COMPARE_RELATE_ITEMS            20071
273
274 #define STARTEAM_TEXT_MDH   "Message Data Header"
275 #define STARTEAM_TEXT_PH    "Packet Header"
276 #define STARTEAM_TEXT_ID    "ID"
277 #define STARTEAM_TEXT_DATA  "Data"
278
279 static const value_string starteam_opcode_vals[] = {
280   { STARTEAM_SRVR_CMD_GET_SESSION_TAG,                      "SRVR_CMD_GET_SESSION_TAG" },
281   { STARTEAM_SRVR_CMD_GET_REQUIRED_ENCRYPTION_LEVEL,        "SRVR_CMD_GET_REQUIRED_ENCRYPTION_LEVEL" },
282   { STARTEAM_SRVR_CMD_GET_SERVER_PARAMS,                    "SRVR_CMD_GET_SERVER_PARAMS" },
283   { STARTEAM_SRVR_CMD_SERVER_CONNECT,                       "SRVR_CMD_SERVER_CONNECT" },
284   { STARTEAM_SRVR_CMD_SERVER_RECONNECT,                     "SRVR_CMD_SERVER_RECONNECT" },
285   { STARTEAM_SRVR_CMD_BEGIN_LOGIN,                          "SRVR_CMD_BEGIN_LOGIN" },
286   { STARTEAM_SRVR_CMD_KEY_EXCHANGE_PHASE0,                  "SRVR_CMD_KEY_EXCHANGE_PHASE0" },
287   { STARTEAM_SRVR_CMD_KEY_EXCHANGE_PHASE12,                 "SRVR_CMD_KEY_EXCHANGE_PHASE12" },
288   { STARTEAM_SRVR_CMD_KEY_EXCHANGE_PHASE3,                  "SRVR_CMD_KEY_EXCHANGE_PHASE3" },
289   { STARTEAM_SRVR_CMD_SERVER_LOGIN,                         "SRVR_CMD_SERVER_LOGIN" },
290   { STARTEAM_SRVR_CMD_GET_PROJECT_LIST,                     "SRVR_CMD_GET_PROJECT_LIST" },
291   { STARTEAM_SRVR_CMD_GET_PROJECT_VIEWS,                    "SRVR_CMD_GET_PROJECT_VIEWS" },
292   { STARTEAM_SRVR_CMD_PROJECT_LOGIN,                        "SRVR_CMD_PROJECT_LOGIN" },
293   { STARTEAM_SRVR_CMD_PROJECT_LOGOUT,                       "SRVR_CMD_PROJECT_LOGOUT" },
294   { STARTEAM_PROJ_CMD_LIST_SET_READ,                        "PROJ_CMD_LIST_SET_READ" },
295   { STARTEAM_PROJ_CMD_LIST_ADD_ATTACHMENT,                  "PROJ_CMD_LIST_ADD_ATTACHMENT" },
296   { STARTEAM_PROJ_CMD_LIST_GET_ATTACHMENT,                  "PROJ_CMD_LIST_GET_ATTACHMENT" },
297   { STARTEAM_PROJ_CMD_LIST_REMOVE_ATTACHMENT,               "PROJ_CMD_LIST_REMOVE_ATTACHMENT" },
298   { STARTEAM_PROJ_CMD_MAIL_LIST_ITEMS,                      "PROJ_CMD_MAIL_LIST_ITEMS" },
299   { STARTEAM_PROJ_CMD_LIST_ANY_NEWITEMS,                    "PROJ_CMD_LIST_ANY_NEWITEMS" },
300   { STARTEAM_PROJ_CMD_LIST_GET_NEWITEMS,                    "PROJ_CMD_LIST_GET_NEWITEMS" },
301   { STARTEAM_SRVR_CMD_RELEASE_CLIENT,                       "SRVR_CMD_RELEASE_CLIENT" },
302   { STARTEAM_SRVR_CMD_UPDATE_SERVER_INFO,                   "SRVR_CMD_UPDATE_SERVER_INFO" },
303   { STARTEAM_SRVR_CMD_GET_USAGE_DATA,                       "SRVR_CMD_GET_USAGE_DATA" },
304   { STARTEAM_SRVR_CMD_GET_LICENSE_INFO,                     "SRVR_CMD_GET_LICENSE_INFO" },
305   { STARTEAM_PROJ_CMD_FILTER_ADD,                           "PROJ_CMD_FILTER_ADD" },
306   { STARTEAM_PROJ_CMD_FILTER_MODIFY,                        "PROJ_CMD_FILTER_MODIFY" },
307   { STARTEAM_PROJ_CMD_FILTER_GET,                           "PROJ_CMD_FILTER_GET" },
308   { STARTEAM_PROJ_CMD_FILTER_GET_LIST,                      "PROJ_CMD_FILTER_GET_LIST" },
309   { STARTEAM_PROJ_CMD_FILTER_DELETE,                        "PROJ_CMD_FILTER_DELETE" },
310   { STARTEAM_PROJ_CMD_QUERY_ADD,                            "PROJ_CMD_QUERY_ADD" },
311   { STARTEAM_PROJ_CMD_QUERY_MODIFY,                         "PROJ_CMD_QUERY_MODIFY" },
312   { STARTEAM_PROJ_CMD_QUERY_GET,                            "PROJ_CMD_QUERY_GET" },
313   { STARTEAM_PROJ_CMD_QUERY_GET_LIST,                       "PROJ_CMD_QUERY_GET_LIST" },
314   { STARTEAM_PROJ_CMD_QUERY_DELETE,                         "PROJ_CMD_QUERY_DELETE" },
315   { STARTEAM_PROJ_GET_FILTER_CLASS_ID,                      "PROJ_GET_FILTER_CLASS_ID" },
316   { STARTEAM_PROJ_GET_QUERY_CLASS_ID,                       "PROJ_GET_QUERY_CLASS_ID" },
317   { STARTEAM_SRVR_CMD_PROJECT_CREATE,                       "SRVR_CMD_PROJECT_CREATE" },
318   { STARTEAM_SRVR_CMD_PROJECT_OPEN,                         "SRVR_CMD_PROJECT_OPEN" },
319   { STARTEAM_SRVR_CMD_PROJECT_CLOSE,                        "SRVR_CMD_PROJECT_CLOSE" },
320   { STARTEAM_PROJ_CMD_CATALOG_LOADALL,                      "PROJ_CMD_CATALOG_LOADALL" },
321   { STARTEAM_PROJ_CMD_CATALOG_LOADSET,                      "PROJ_CMD_CATALOG_LOADSET" },
322   { STARTEAM_PROJ_CMD_CATALOG_LOADREGISTEREDCLASSES,        "PROJ_CMD_CATALOG_LOADREGISTEREDCLASSES" },
323   { STARTEAM_PROJ_CMD_REFRESH_CLASS_INFO,                   "PROJ_CMD_REFRESH_CLASS_INFO" },
324   { STARTEAM_PROJ_CMD_ADD_CUSTOM_FIELD_CLASS_INFO,          "PROJ_CMD_ADD_CUSTOM_FIELD_CLASS_INFO" },
325   { STARTEAM_PROJ_CMD_MODIFY_FIELD_CLASS_INFO,              "PROJ_CMD_MODIFY_FIELD_CLASS_INFO" },
326   { STARTEAM_PROJ_CMD_ADD_CUSTOM_FIELD_CLASS_INFO_EX,       "PROJ_CMD_ADD_CUSTOM_FIELD_CLASS_INFO_EX" },
327   { STARTEAM_PROJ_CMD_GET_FOLDER_ITEMS,                     "PROJ_CMD_GET_FOLDER_ITEMS" },
328   { STARTEAM_SRVR_CMD_GET_USERS_AND_GROUPS,                 "SRVR_CMD_GET_USERS_AND_GROUPS" },
329   { STARTEAM_PROJ_CMD_REFRESH_ITEMS,                        "PROJ_CMD_REFRESH_ITEMS" },
330   { STARTEAM_PROJ_CMD_GET_ITEM,                             "PROJ_CMD_GET_ITEM" },
331   { STARTEAM_SRVR_CMD_GET_EMAIL_USERS,                      "SRVR_CMD_GET_EMAIL_USERS" },
332   { STARTEAM_PROJ_CMD_UPDATE_ITEM,                          "PROJ_CMD_UPDATE_ITEM" },
333   { STARTEAM_PROJ_CMD_DELETE_ITEM,                          "PROJ_CMD_DELETE_ITEM" },
334   { STARTEAM_PROJ_CMD_SET_ITEM_LOCK,                        "PROJ_CMD_SET_ITEM_LOCK" },
335   { STARTEAM_PROJ_CMD_DELETE_TREE_ITEM,                     "PROJ_CMD_DELETE_TREE_ITEM" },
336   { STARTEAM_PROJ_CMD_GET_ITEM_HISTORY,                     "PROJ_CMD_GET_ITEM_HISTORY" },
337   { STARTEAM_SRVR_CMD_GET_USER_PERSONAL_INFO,               "SRVR_CMD_GET_USER_PERSONAL_INFO" },
338   { STARTEAM_SRVR_CMD_SET_USER_PERSONAL_INFO,               "SRVR_CMD_SET_USER_PERSONAL_INFO" },
339   { STARTEAM_SRVR_CMD_SET_USER_PASSWORD,                    "SRVR_CMD_SET_USER_PASSWORD" },
340   { STARTEAM_PROJ_CMD_MOVE_ITEMS,                           "PROJ_CMD_MOVE_ITEMS" },
341   { STARTEAM_PROJ_CMD_MOVE_TREE_ITEMS,                      "PROJ_CMD_MOVE_TREE_ITEMS" },
342   { STARTEAM_SRVR_CMD_GET_GROUP_INFO,                       "SRVR_CMD_GET_GROUP_INFO" },
343   { STARTEAM_PROJ_CMD_SHARE_ITEMS,                          "PROJ_CMD_SHARE_ITEMS" },
344   { STARTEAM_SRVR_CMD_ADD_EDIT_GROUP_INFO,                  "SRVR_CMD_ADD_EDIT_GROUP_INFO" },
345   { STARTEAM_PROJ_CMD_SHARE_TREE_ITEMS,                     "PROJ_CMD_SHARE_TREE_ITEMS" },
346   { STARTEAM_SRVR_CMD_DROP_GROUP,                           "SRVR_CMD_DROP_GROUP" },
347   { STARTEAM_SRVR_CMD_GET_USER_INFO,                        "SRVR_CMD_GET_USER_INFO" },
348   { STARTEAM_SRVR_CMD_ADD_EDIT_USER_INFO,                   "SRVR_CMD_ADD_EDIT_USER_INFO" },
349   { STARTEAM_SRVR_CMD_DROP_USER,                            "SRVR_CMD_DROP_USER" },
350   { STARTEAM_SRVR_CMD_GET_MIN_PASSWORD_LENGTH,              "SRVR_CMD_GET_MIN_PASSWORD_LENGTH" },
351   { STARTEAM_SRVR_CMD_USER_ADMIN_OPERATION,                 "SRVR_CMD_USER_ADMIN_OPERATION" },
352   { STARTEAM_SRVR_CMD_ACCESS_CHECK,                         "SRVR_CMD_ACCESS_CHECK" },
353   { STARTEAM_PROJ_CMD_GET_COMMON_ANCESTOR_ITEM,             "PROJ_CMD_GET_COMMON_ANCESTOR_ITEM" },
354   { STARTEAM_SRVR_CMD_ACCESS_TEST,                          "SRVR_CMD_ACCESS_TEST" },
355   { STARTEAM_PROJ_CMD_UPDATE_REVISION_COMMENT,              "PROJ_CMD_UPDATE_REVISION_COMMENT" },
356   { STARTEAM_SRVR_CMD_GET_MAIN_LOG_LAST64K,                 "SRVR_CMD_GET_MAIN_LOG_LAST64K" },
357   { STARTEAM_SRVR_CMD_GET_SERVER_CONFIG,                    "SRVR_CMD_GET_SERVER_CONFIG" },
358   { STARTEAM_SRVR_CMD_SET_SERVER_CONFIG,                    "SRVR_CMD_SET_SERVER_CONFIG" },
359   { STARTEAM_SRVR_CMD_GET_SERVER_ACL,                       "SRVR_CMD_GET_SERVER_ACL" },
360   { STARTEAM_SRVR_CMD_DROP_SERVER_ACL,                      "SRVR_CMD_DROP_SERVER_ACL" },
361   { STARTEAM_SRVR_CMD_SET_SERVER_ACL,                       "SRVR_CMD_SET_SERVER_ACL" },
362   { STARTEAM_SRVR_CMD_GET_SYSTEM_POLICY,                    "SRVR_CMD_GET_SYSTEM_POLICY" },
363   { STARTEAM_SRVR_CMD_SET_SYSTEM_POLICY,                    "SRVR_CMD_SET_SYSTEM_POLICY" },
364   { STARTEAM_SRVR_CMD_GET_SECURITY_LOG,                     "SRVR_CMD_GET_SECURITY_LOG" },
365   { STARTEAM_SRVR_CMD_GET_SERVER_COMMAND_STATS,             "SRVR_CMD_GET_SERVER_COMMAND_STATS" },
366   { STARTEAM_SRVR_CMD_SET_SERVER_COMMAND_MODE,              "SRVR_CMD_SET_SERVER_COMMAND_MODE" },
367   { STARTEAM_SRVR_CMD_SHUTDOWN,                             "SRVR_CMD_SHUTDOWN" },
368   { STARTEAM_SRVR_CMD_RESTART,                              "SRVR_CMD_RESTART" },
369   { STARTEAM_SRVR_CMD_GET_SERVER_COMMAND_MODE,              "SRVR_CMD_GET_SERVER_COMMAND_MODE" },
370   { STARTEAM_SRVR_CMD_GET_LOG,                              "SRVR_CMD_GET_LOG" },
371   { STARTEAM_SRVR_CMD_GET_COMPONENT_LIST,                   "SRVR_CMD_GET_COMPONENT_LIST" },
372   { STARTEAM_SRVR_CMD_GET_GROUP_MEMBERS,                    "SRVR_CMD_GET_GROUP_MEMBERS" },
373   { STARTEAM_PROJ_CMD_GET_ITEMS_VERSIONS,                   "PROJ_CMD_GET_ITEMS_VERSIONS" },
374   { STARTEAM_SRVR_CMD_VALIDATE_VSS_INI_PATH,                "SRVR_CMD_VALIDATE_VSS_INI_PATH" },
375   { STARTEAM_SRVR_CMD_VALIDATE_PVCS_CFG_PATH,               "SRVR_CMD_VALIDATE_PVCS_CFG_PATH" },
376   { STARTEAM_SRVR_CMD_GET_VSS_PROJECT_TREE,                 "SRVR_CMD_GET_VSS_PROJECT_TREE" },
377   { STARTEAM_SRVR_CMD_GET_ALL_PVCS_ARCHIVES,                "SRVR_CMD_GET_ALL_PVCS_ARCHIVES" },
378   { STARTEAM_SRVR_CMD_INITIALIZE_FOREIGN_ACCESS,            "SRVR_CMD_INITIALIZE_FOREIGN_ACCESS" },
379   { STARTEAM_SRVR_CMD_SET_FOREIGN_PROJECT_PW,               "SRVR_CMD_SET_FOREIGN_PROJECT_PW" },
380   { STARTEAM_PROJ_CMD_PING,                                 "PROJ_CMD_PING" },
381   { STARTEAM_PROJ_CMD_SET_LOCALE,                           "PROJ_CMD_SET_LOCALE" },
382   { STARTEAM_PROJ_CMD_GET_CONTAINER_ACL,                    "PROJ_CMD_GET_CONTAINER_ACL" },
383   { STARTEAM_PROJ_CMD_SET_CONTAINER_ACL,                    "PROJ_CMD_SET_CONTAINER_ACL" },
384   { STARTEAM_PROJ_CMD_GET_CONTAINER_LEVEL_ACL,              "PROJ_CMD_GET_CONTAINER_LEVEL_ACL" },
385   { STARTEAM_PROJ_CMD_SET_CONTAINER_LEVEL_ACL,              "PROJ_CMD_SET_CONTAINER_LEVEL_ACL" },
386   { STARTEAM_PROJ_CMD_GET_OBJECT_ACL,                       "PROJ_CMD_GET_OBJECT_ACL" },
387   { STARTEAM_PROJ_CMD_SET_OBJECT_ACL,                       "PROJ_CMD_SET_OBJECT_ACL" },
388   { STARTEAM_PROJ_CMD_ITEM_ACCESS_CHECK,                    "PROJ_CMD_ITEM_ACCESS_CHECK" },
389   { STARTEAM_PROJ_CMD_ITEM_ACCESS_TEST,                     "PROJ_CMD_ITEM_ACCESS_TEST" },
390   { STARTEAM_PROJ_CMD_GET_OWNER,                            "PROJ_CMD_GET_OWNER" },
391   { STARTEAM_PROJ_CMD_ACQUIRE_OWNERSHIP,                    "PROJ_CMD_ACQUIRE_OWNERSHIP" },
392   { STARTEAM_PROJ_CMD_GET_FOLDERS,                          "PROJ_CMD_GET_FOLDERS" },
393   { STARTEAM_PROJ_CMD_ADD_FOLDERS,                          "PROJ_CMD_ADD_FOLDERS" },
394   { STARTEAM_PROJ_CMD_DELETE_FOLDER,                        "PROJ_CMD_DELETE_FOLDER" },
395   { STARTEAM_PROJ_CMD_MOVE_FOLDER,                          "PROJ_CMD_MOVE_FOLDER" },
396   { STARTEAM_PROJ_CMD_SHARE_FOLDER,                         "PROJ_CMD_SHARE_FOLDER" },
397   { STARTEAM_PROJ_CMD_CONTAINER_ACCESS_CHECK,               "PROJ_CMD_CONTAINER_ACCESS_CHECK" },
398   { STARTEAM_PROJ_CMD_CONTAINER_ACCESS_TEST,                "PROJ_CMD_CONTAINER_ACCESS_TEST" },
399   { STARTEAM_PROJ_CMD_GET_OBJECT2_ACL,                      "PROJ_CMD_GET_OBJECT2_ACL" },
400   { STARTEAM_PROJ_CMD_SET_OBJECT2_ACL,                      "PROJ_CMD_SET_OBJECT2_ACL" },
401   { STARTEAM_PROJ_CMD_OBJECT_ACCESS_CHECK,                  "PROJ_CMD_OBJECT_ACCESS_CHECK" },
402   { STARTEAM_PROJ_CMD_OBJECT_ACCESS_TEST,                   "PROJ_CMD_OBJECT_ACCESS_TEST" },
403   { STARTEAM_PROJ_CMD_GET_OBJECT_OWNER,                     "PROJ_CMD_GET_OBJECT_OWNER" },
404   { STARTEAM_PROJ_CMD_ACQUIRE_OBJECT_OWNERSHIP,             "PROJ_CMD_ACQUIRE_OBJECT_OWNERSHIP" },
405   { STARTEAM_PROJ_CMD_GET_FOLDER_PROPERTIES,                "PROJ_CMD_GET_FOLDER_PROPERTIES" },
406   { STARTEAM_PROJ_CMD_SET_FOLDER_PROPERTIES,                "PROJ_CMD_SET_FOLDER_PROPERTIES" },
407   { STARTEAM_PROJ_CMD_GET_ITEM_PROPERTIES,                  "PROJ_CMD_GET_ITEM_PROPERTIES" },
408   { STARTEAM_PROJ_CMD_SET_ITEM_PROPERTIES,                  "PROJ_CMD_SET_ITEM_PROPERTIES" },
409   { STARTEAM_PROJ_CMD_GET_ITEM_REFERENCES,                  "PROJ_CMD_GET_ITEM_REFERENCES" },
410   { STARTEAM_PROJ_CMD_GET_ITEM_REFERENCE,                   "PROJ_CMD_GET_ITEM_REFERENCE" },
411   { STARTEAM_PROJ_CMD_GET_ITEM_REVISIONS,                   "PROJ_CMD_GET_ITEM_REVISIONS" },
412   { STARTEAM_PROJ_CMD_DELETE_PROJECT,                       "PROJ_CMD_DELETE_PROJECT" },
413   { STARTEAM_PROJ_CMD_GET_PROJECT_PROPERTIES,               "PROJ_CMD_GET_PROJECT_PROPERTIES" },
414   { STARTEAM_PROJ_CMD_SET_PROJECT_PROPERTIES,               "PROJ_CMD_SET_PROJECT_PROPERTIES" },
415   { STARTEAM_PROJ_CMD_GET_VIEW_INFO,                        "PROJ_CMD_GET_VIEW_INFO" },
416   { STARTEAM_PROJ_CMD_ADD_VIEW,                             "PROJ_CMD_ADD_VIEW" },
417   { STARTEAM_PROJ_CMD_GET_VIEWS,                            "PROJ_CMD_GET_VIEWS" },
418   { STARTEAM_PROJ_CMD_GET_VIEW_PROPERTIES,                  "PROJ_CMD_GET_VIEW_PROPERTIES" },
419   { STARTEAM_PROJ_CMD_SET_VIEW_PROPERTIES,                  "PROJ_CMD_SET_VIEW_PROPERTIES" },
420   { STARTEAM_PROJ_CMD_DELETE_VIEW,                          "PROJ_CMD_DELETE_VIEW" },
421   { STARTEAM_PROJ_CMD_SWITCH_VIEW,                          "PROJ_CMD_SWITCH_VIEW" },
422   { STARTEAM_PROJ_CMD_SWITCH_VIEW_CONFIG,                   "PROJ_CMD_SWITCH_VIEW_CONFIG" },
423   { STARTEAM_PROJ_CMD_GET_FOLDER_PATH,                      "PROJ_CMD_GET_FOLDER_PATH" },
424   { STARTEAM_FILE_CMD_CHECKOUT,                             "FILE_CMD_CHECKOUT" },
425   { STARTEAM_FILE_CMD_GET_SYNC_INFO,                        "FILE_CMD_GET_SYNC_INFO" },
426   { STARTEAM_FILE_CMD_DELETE_SYNC_INFO,                     "FILE_CMD_DELETE_SYNC_INFO" },
427   { STARTEAM_FILE_CMD_GET_PATH_IDS,                         "FILE_CMD_GET_PATH_IDS" },
428   { STARTEAM_FILE_CMD_SYNC_UPDATE_ALL_INFO,                 "FILE_CMD_SYNC_UPDATE_ALL_INFO" },
429   { STARTEAM_FILE_CMD_RESYNC_FILE,                          "FILE_CMD_RESYNC_FILE" },
430   { STARTEAM_FILE_CMD_CONVERT_ARCHIVE,                      "FILE_CMD_CONVERT_ARCHIVE" },
431   { STARTEAM_FILE_CMD_ARCHIVE_CONVERSION,                   "FILE_CMD_ARCHIVE_CONVERSION" },
432   { STARTEAM_FILE_CMD_READ_PVCS_ARCHIVES,                   "FILE_CMD_READ_PVCS_ARCHIVES" },
433   { STARTEAM_FILE_CMD_ADD_PVCS_ARCHIVES,                    "FILE_CMD_ADD_PVCS_ARCHIVES" },
434   { STARTEAM_FILE_CMD_ADD_PVCS_BRANCHES,                    "FILE_CMD_ADD_PVCS_BRANCHES" },
435   { STARTEAM_FILE_CMD_FINISH_NEW_PVCS_PROJECT,              "FILE_CMD_FINISH_NEW_PVCS_PROJECT" },
436   { STARTEAM_FILE_CMD_GET_NUMBER_VSS_ARCHIVES,              "FILE_CMD_GET_NUMBER_VSS_ARCHIVES" },
437   { STARTEAM_FILE_CMD_READ_VSS_ARCHIVES,                    "FILE_CMD_READ_VSS_ARCHIVES" },
438   { STARTEAM_FILE_CMD_ADD_VSS_ARCHIVE_TO_FOLDER,            "FILE_CMD_ADD_VSS_ARCHIVE_TO_FOLDER" },
439   { STARTEAM_FILE_CMD_FINISH_NEW_VSS_PROJECT,               "FILE_CMD_FINISH_NEW_VSS_PROJECT" },
440   { STARTEAM_FILE_CMD_REFRESH_FOREIGN_FOLDER,               "FILE_CMD_REFRESH_FOREIGN_FOLDER" },
441   { STARTEAM_FILE_CMD_START_GO_NATIVE,                      "FILE_CMD_START_GO_NATIVE" },
442   { STARTEAM_FILE_CMD_GET_PROJECT_TYPE,                     "FILE_CMD_GET_PROJECT_TYPE" },
443   { STARTEAM_FILE_CMD_SET_FOREIGN_PROJECT_PW,               "FILE_CMD_SET_FOREIGN_PROJECT_PW" },
444   { STARTEAM_FILE_CMD_INTERNAL_NESTED_COMMAND,              "FILE_CMD_INTERNAL_NESTED_COMMAND" },
445   { STARTEAM_PROJ_CMD_LABEL_GET_INFO,                       "PROJ_CMD_LABEL_GET_INFO" },
446   { STARTEAM_PROJ_CMD_LABEL_GET_PROPERTIES,                 "PROJ_CMD_LABEL_GET_PROPERTIES" },
447   { STARTEAM_PROJ_CMD_LABEL_SET_PROPERTIES,                 "PROJ_CMD_LABEL_SET_PROPERTIES" },
448   { STARTEAM_PROJ_CMD_LABEL_CREATE,                         "PROJ_CMD_LABEL_CREATE" },
449   { STARTEAM_PROJ_CMD_LABEL_DELETE,                         "PROJ_CMD_LABEL_DELETE" },
450   { STARTEAM_PROJ_CMD_LABEL_ATTACH,                         "PROJ_CMD_LABEL_ATTACH" },
451   { STARTEAM_PROJ_CMD_LABEL_MOVE,                           "PROJ_CMD_LABEL_MOVE" },
452   { STARTEAM_PROJ_CMD_LABEL_DETACH,                         "PROJ_CMD_LABEL_DETACH" },
453   { STARTEAM_PROJ_CMD_LABEL_GET_INFO_EX,                    "PROJ_CMD_LABEL_GET_INFO_EX" },
454   { STARTEAM_PROJ_CMD_LABEL_CREATE_EX,                      "PROJ_CMD_LABEL_CREATE_EX" },
455   { STARTEAM_PROJ_CMD_LABEL_ATTACH_EX,                      "PROJ_CMD_LABEL_ATTACH_EX" },
456   { STARTEAM_PROJ_CMD_LABEL_ATTACH_ITEMS,                   "PROJ_CMD_LABEL_ATTACH_ITEMS" },
457   { STARTEAM_PROJ_CMD_LABEL_DETACH_EX,                      "PROJ_CMD_LABEL_DETACH_EX" },
458   { STARTEAM_PROJ_CMD_LABEL_DETACH_ITEMS,                   "PROJ_CMD_LABEL_DETACH_ITEMS" },
459   { STARTEAM_PROJ_CMD_LABEL_GETITEMIDS,                     "PROJ_CMD_LABEL_GETITEMIDS" },
460   { STARTEAM_PROJ_CMD_LINK_GET_INFO,                        "PROJ_CMD_LINK_GET_INFO" },
461   { STARTEAM_PROJ_CMD_LINK_CREATE,                          "PROJ_CMD_LINK_CREATE" },
462   { STARTEAM_PROJ_CMD_LINK_DELETE,                          "PROJ_CMD_LINK_DELETE" },
463   { STARTEAM_PROJ_CMD_LINK_UPDATE_PROPERTIES,               "PROJ_CMD_LINK_UPDATE_PROPERTIES" },
464   { STARTEAM_PROJ_CMD_LINK_UPDATE_PINS,                     "PROJ_CMD_LINK_UPDATE_PINS" },
465   { STARTEAM_PROJ_CMD_PROMOTION_GET,                        "PROJ_CMD_PROMOTION_GET" },
466   { STARTEAM_PROJ_CMD_PROMOTION_SET,                        "PROJ_CMD_PROMOTION_SET" },
467   { STARTEAM_TASK_CMD_GET_WORKRECS,                         "TASK_CMD_GET_WORKRECS" },
468   { STARTEAM_TASK_CMD_ADD_WORKREC,                          "TASK_CMD_ADD_WORKREC" },
469   { STARTEAM_TASK_CMD_UPDATE_WORKREC,                       "TASK_CMD_UPDATE_WORKREC" },
470   { STARTEAM_TASK_CMD_DELETE_WORKREC,                       "TASK_CMD_DELETE_WORKREC" },
471   { STARTEAM_TASK_CMD_DELETE_TASK_PREDECESSOR,              "TASK_CMD_DELETE_TASK_PREDECESSOR" },
472   { STARTEAM_TASK_CMD_GET_TASK_DEPENDENCIES,                "TASK_CMD_GET_TASK_DEPENDENCIES" },
473   { STARTEAM_TASK_CMD_ADD_TASK_PREDECESSOR,                 "TASK_CMD_ADD_TASK_PREDECESSOR" },
474   { STARTEAM_TASK_CMD_UPDATE_TASK_PREDECESSOR,              "TASK_CMD_UPDATE_TASK_PREDECESSOR" },
475   { STARTEAM_PROJ_CMD_VIEW_COMPARE_GET_FOLDER_DETAILS,      "PROJ_CMD_VIEW_COMPARE_GET_FOLDER_DETAILS" },
476   { STARTEAM_PROJ_CMD_VIEW_COMPARE_RELATE_ITEMS,            "PROJ_CMD_VIEW_COMPARE_RELATE_ITEMS" },
477   { 0,          NULL }
478 };
479
480 static void
481 dissect_starteam(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
482 {
483         proto_tree      *starteam_tree = NULL;
484         proto_tree      *starteamroot_tree = NULL;
485         proto_item      *ti = NULL;
486         gint offset = 0;
487         static gint iPreviousFrameNumber = -1;
488
489         if(check_col(pinfo->cinfo, COL_PROTOCOL)){
490                 col_set_str(pinfo->cinfo, COL_PROTOCOL, "StarTeam");
491         }
492
493         if(check_col(pinfo->cinfo, COL_INFO)){
494                 /* This is a trick to know whether this is the first PDU in this packet or not */
495                 if(iPreviousFrameNumber != (gint) pinfo->fd->num){
496                         col_clear(pinfo->cinfo, COL_INFO);
497                 } else {
498                         col_append_str(pinfo->cinfo, COL_INFO, " | ");
499                 }
500         }
501         iPreviousFrameNumber = pinfo->fd->num;
502         if(tvb_length(tvb) >= 16){
503                 guint32 iCommand = 0;
504                 gboolean bRequest = FALSE;
505                 if(tvb_get_ntohl(tvb, offset + 0) == STARTEAM_MAGIC){ 
506                         /* This packet is a response */
507                         bRequest = FALSE; 
508                         if(check_col(pinfo->cinfo, COL_INFO)){
509                                 col_append_fstr(pinfo->cinfo, COL_INFO, "Reply: %d bytes", tvb_length(tvb));
510                         }
511                 } else if(tvb_length_remaining(tvb, offset) >= 28 && tvb_get_ntohl(tvb, offset + 20) == STARTEAM_MAGIC){
512                         /* This packet is a request */
513                         bRequest = TRUE; 
514                         if(tvb_length_remaining(tvb, offset) >= 66){
515                                 iCommand = tvb_get_letohl(tvb, offset + 62);
516                         }
517                         if(check_col(pinfo->cinfo, COL_INFO)){
518                                 col_append_str(pinfo->cinfo, COL_INFO, val_to_str(iCommand, starteam_opcode_vals, "Unknown (0x%02x)"));
519                         }
520                 }
521
522                 if(tree){
523                         ti = proto_tree_add_item(tree, proto_starteam, tvb, offset, -1, FALSE);
524                         if (bRequest) proto_item_append_text(ti, " (%s)", val_to_str(iCommand, starteam_opcode_vals, "Unknown (0x%02x)"));
525                         starteamroot_tree = proto_item_add_subtree(ti, ett_starteam);
526
527                         if(bRequest){
528                                 if(tvb_length_remaining(tvb, offset) >= 20){
529                                         ti = proto_tree_add_text(starteamroot_tree, tvb, offset, 20, STARTEAM_TEXT_MDH);
530                                         starteam_tree = proto_item_add_subtree(ti, ett_starteam_mdh);
531         
532                                         proto_tree_add_item(starteam_tree, hf_starteam_mdh_session_tag, tvb, offset + 0, 4, TRUE);
533                                         proto_tree_add_item(starteam_tree, hf_starteam_mdh_ctimestamp, tvb, offset + 4, 4, TRUE);
534                                         proto_tree_add_item(starteam_tree, hf_starteam_mdh_flags, tvb, offset + 8, 4, TRUE);
535                                         proto_tree_add_item(starteam_tree, hf_starteam_mdh_keyid, tvb, offset + 12, 4, TRUE);
536                                         proto_tree_add_item(starteam_tree, hf_starteam_mdh_reserved, tvb, offset + 16, 4, TRUE);
537                                         offset += 20;
538                                 }
539                         }
540
541                         if(tvb_length_remaining(tvb, offset) >= 16){
542                                 ti = proto_tree_add_text(starteamroot_tree, tvb, offset, 16, STARTEAM_TEXT_PH);
543                                 starteam_tree = proto_item_add_subtree(ti, ett_starteam_ph);
544         
545                                 proto_tree_add_item(starteam_tree, hf_starteam_ph_signature, tvb, offset + 0, 4, FALSE);
546                                 proto_tree_add_item(starteam_tree, hf_starteam_ph_packet_size, tvb, offset + 4, 4, TRUE);
547                                 proto_tree_add_item(starteam_tree, hf_starteam_ph_data_size, tvb, offset + 8, 4, TRUE);
548                                 proto_tree_add_item(starteam_tree, hf_starteam_ph_data_flags, tvb, offset + 12, 4, TRUE);
549                                 offset += 16;
550         
551                                 if(bRequest){
552                                         if(tvb_length_remaining(tvb, offset) >= 38){
553                                                 ti = proto_tree_add_text(starteamroot_tree, tvb, offset, 38, STARTEAM_TEXT_ID);
554                                                 starteam_tree = proto_item_add_subtree(ti, ett_starteam_id);
555                         
556                                                 proto_tree_add_item(starteam_tree, hf_starteam_id_revision_level, tvb, offset + 0, 2, TRUE);
557                                                 proto_tree_add_item(starteam_tree, hf_starteam_id_client, tvb, offset + 2, 16, TRUE);
558                                                 proto_tree_add_item(starteam_tree, hf_starteam_id_connect, tvb, offset + 18, 4, TRUE);
559                                                 proto_tree_add_item(starteam_tree, hf_starteam_id_component, tvb, offset + 22, 4, TRUE);
560                                                 proto_tree_add_item(starteam_tree, hf_starteam_id_command, tvb, offset + 26, 4, TRUE);
561                                                 proto_tree_add_item(starteam_tree, hf_starteam_id_command_time, tvb, offset + 30, 4, TRUE);
562                                                 proto_tree_add_item(starteam_tree, hf_starteam_id_command_userid, tvb, offset + 34, 4, TRUE);
563                                                 offset += 38;
564                                         }
565                                 }
566                                 if(tvb_length_remaining(tvb, offset) > 0){
567                                         ti = proto_tree_add_text(starteamroot_tree, tvb, offset, -1, STARTEAM_TEXT_DATA);
568                                         starteam_tree = proto_item_add_subtree(ti, ett_starteam_data);
569                                         proto_tree_add_item(starteam_tree, hf_starteam_data_data, tvb, offset, tvb_length_remaining(tvb, offset), TRUE);        
570                                 }
571                         }
572                 }
573         }
574 }
575
576 static guint
577 get_starteam_pdu_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset)
578 {
579         guint32 iPDULength = 0;
580         if(tvb_length_remaining(tvb, offset) >= 8 && tvb_get_ntohl(tvb, offset + 0) == STARTEAM_MAGIC){ 
581                 /* Response */
582                 iPDULength = tvb_get_letohl(tvb, offset + 4) + 16;
583         } else if(tvb_length_remaining(tvb, offset) >= 28 && tvb_get_ntohl(tvb, offset + 20) == STARTEAM_MAGIC){
584                 /* Request */
585                 iPDULength = tvb_get_letohl(tvb, offset + 24) + 36;                                     
586         }               
587         return iPDULength;
588 }
589
590 static void
591 dissect_starteam_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
592 {
593         tcp_dissect_pdus(tvb, pinfo, tree, starteam_desegment, 8, get_starteam_pdu_len, dissect_starteam);
594 }
595
596
597 static gboolean
598 dissect_starteam_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
599 {
600         if(tvb_length(tvb) >= 32){
601                 gint iOffsetLengths = -1;
602                 if(tvb_get_ntohl(tvb, 0) == STARTEAM_MAGIC){
603                         iOffsetLengths = 4;
604                 } else if(tvb_get_ntohl(tvb, 20) == STARTEAM_MAGIC){
605                         iOffsetLengths = 24;
606                 } 
607                 if(iOffsetLengths != -1){
608                         guint32 iLengthPacket;
609                         guint32 iLengthData;
610                         iLengthPacket = tvb_get_letohl(tvb, iOffsetLengths);
611                         iLengthData = tvb_get_letohl(tvb, iOffsetLengths + 4);
612                         
613                         if(iLengthPacket == iLengthData){
614                                 /* Register this dissector for this conversation */
615                                 conversation_t  *conversation = NULL;
616                                 conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
617                                 if(conversation == NULL){
618                                         conversation = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
619                                 }
620                                 conversation_set_dissector(conversation, starteam_tcp_handle);
621         
622                                 /* Dissect the packet */
623                                 dissect_starteam(tvb, pinfo, tree);
624                                 return TRUE;
625                         }
626                 }
627         }
628         return FALSE;
629 }
630
631 void
632 proto_register_starteam(void)
633 {
634   static hf_register_info hf[] = {
635    { &hf_starteam_mdh_session_tag,
636       { "Session tag", "starteam.mdh.stag", FT_UINT32, BASE_DEC, NULL, 0x0, "MDH session tag", HFILL }},
637
638    { &hf_starteam_mdh_ctimestamp,
639       { "Client timestamp", "starteam.mdh.ctimestamp", FT_UINT32, BASE_DEC, NULL, 0x0, "MDH client timestamp", HFILL }},
640
641    { &hf_starteam_mdh_flags,
642       { "Flags", "starteam.mdh.flags", FT_UINT32, BASE_HEX, NULL, 0x0, "MDH flags", HFILL }},
643
644    { &hf_starteam_mdh_keyid,
645       { "Key ID", "starteam.mdh.keyid", FT_UINT32, BASE_HEX, NULL, 0x0, "MDH key ID", HFILL }},
646
647    { &hf_starteam_mdh_reserved,
648       { "Reserved", "starteam.mdh.reserved", FT_UINT32, BASE_HEX, NULL, 0x0, "MDH reserved", HFILL }},
649
650    { &hf_starteam_ph_signature,
651       { "Signature", "starteam.ph.signature", FT_STRINGZ, BASE_HEX, NULL, 0x0, "PH signature", HFILL }},
652
653    { &hf_starteam_ph_packet_size,
654       { "Packet size", "starteam.ph.psize", FT_UINT32, BASE_DEC, NULL, 0x0, "PH packet size", HFILL }},
655
656    { &hf_starteam_ph_data_size,
657       { "Data size", "starteam.ph.dsize", FT_UINT32, BASE_DEC, NULL, 0x0, "PH data size", HFILL }},
658
659    { &hf_starteam_ph_data_flags,
660       { "Flags", "starteam.ph.flags", FT_UINT32, BASE_HEX, NULL, 0x0, "PH flags", HFILL }},
661
662    { &hf_starteam_id_revision_level,
663       { "Revision level", "starteam.id.level", FT_UINT16, BASE_DEC, NULL, 0x0, "ID revision level", HFILL }},
664
665    { &hf_starteam_id_client,
666       { "Client ID", "starteam.id.client", FT_STRINGZ, BASE_HEX, NULL, 0x0, "ID client ID", HFILL }},
667
668    { &hf_starteam_id_connect,
669       { "Connect ID", "starteam.id.connect", FT_UINT32, BASE_HEX, NULL, 0x0, "ID connect ID", HFILL }},
670
671    { &hf_starteam_id_component,
672       { "Component ID", "starteam.id.component", FT_UINT32, BASE_DEC, NULL, 0x0, "ID component ID", HFILL }},
673
674    { &hf_starteam_id_command,
675       { "Command ID", "starteam.id.command", FT_UINT32, BASE_DEC, VALS(starteam_opcode_vals), 0x0, "ID command ID", HFILL }},
676
677    { &hf_starteam_id_command_time,
678       { "Command time", "starteam.id.commandtime", FT_UINT32, BASE_HEX, NULL, 0x0, "ID command time", HFILL }},
679
680    { &hf_starteam_id_command_userid,
681       { "Command user ID", "starteam.id.commanduserid", FT_UINT32, BASE_HEX, NULL, 0x0, "ID command user ID", HFILL }},
682
683    { &hf_starteam_data_data,
684       { "Data", "starteam.data", FT_STRINGZ, BASE_HEX, NULL, 0x0, "Data", HFILL }}
685   };
686   static gint *ett[] = {
687     &ett_starteam,
688     &ett_starteam_mdh,    
689     &ett_starteam_ph,
690     &ett_starteam_id,
691     &ett_starteam_data
692   };
693
694   module_t *starteam_module;
695
696   proto_starteam = proto_register_protocol("StarTeam", "StarTeam", "starteam");
697   proto_register_field_array(proto_starteam, hf, array_length(hf));
698   proto_register_subtree_array(ett, array_length(ett));
699   
700   starteam_module = prefs_register_protocol(proto_starteam, NULL);
701   prefs_register_bool_preference(starteam_module, "desegment",
702     "Reassemble StarTeam messages spanning multiple TCP segments",
703     "Whether the StarTeam dissector should reassemble messages spanning multiple TCP segments."
704     " To use this option, you must also enable \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings.",
705     &starteam_desegment);
706   
707 }
708
709 void
710 proto_reg_handoff_starteam(void)
711 {
712         heur_dissector_add("tcp", dissect_starteam_heur, proto_starteam);
713         starteam_tcp_handle = create_dissector_handle(dissect_starteam_tcp, proto_starteam);
714 }