/* Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved. */ #include <ProUIMessage.h> #include <ProWstring.h> #include <stdio.h> #include <wchar.h> static ProBoolean s_interactive = PRO_B_TRUE; /*====================================================================*\ FUNCTION: PTWCUtilSetInteractive PURPOSE: Set the mode of the application to be interactive or non-interactive \*====================================================================*/ ProError PTWCUtilSetInteractive (ProBoolean interactive) { s_interactive = interactive; return PRO_TK_NO_ERROR; } /*====================================================================*\ FUNCTION: PTWCUtilGetInteractive PURPOSE: Identifies if the application is in interactive mode or not \*====================================================================*/ ProBoolean PTWCUtilGetInteractive () { return s_interactive; } /*====================================================================*\ FUNCTION: PTWCUtilConflictReport PURPOSE: Inform the user of the description of the latest checkout conflict, and log it as well. \*====================================================================*/ ProError PTWCUtilConflictReport (ProServerConflicts conflicts) { wchar_t* description; char* c_description; int length; ProServerconflictsDescriptionGet (conflicts, &description); ProWstringLengthGet (description, &length); /* Allow for the potential of multibyte characters in the conflict description. */ length = length * 3; length++; c_description = (char*) calloc (length, sizeof (char)); ProWstringToString (c_description, description); fprintf (errlog_fp, c_description); fprintf (errlog_fp, "\n"); if (PTWCUtilGetInteractive ()) { ProUIMessageButton* buttons; ProUIMessageButton result; ProArrayAlloc (1, sizeof (ProUIMessageButton), 1, (ProArray*)&buttons); buttons[0] = PRO_UI_MESSAGE_OK; ProUIMessageDialogDisplay (PROUIMESSAGE_ERROR, L"Conflict occurred", description, buttons, buttons[0], &result); } ProWstringFree (description); free (&c_description); return PRO_TK_NO_ERROR; } /*====================================================================*\ FUNCTION: PTWCUtilRemoveAllFromWS PURPOSE: Remove all objects from the workspace \*====================================================================*/ ProError PTWCUtilRemoveAllFromWS (wchar_t* alias, wchar_t* ws_name) { ProServerRemoveConflicts conflicts = NULL; wchar_t* current_ws_name; int result; status = ProServerWorkspaceGet (alias, ¤t_ws_name); PT_TEST_LOG_SUCC ("ProServerWorkspaceGet()"); ProWstringCompare (ws_name, current_ws_name, PRO_VALUE_UNUSED, &result); if (result != 0) { status = ProServerWorkspaceSet (alias, ws_name); PT_TEST_LOG_SUCC ("ProServerWorkspaceSet()"); } status = ProServerObjectsRemove (NULL, &conflicts); PT_TEST_LOG_SUCC ("ProServerObjectsRemove()"); if (status != PRO_TK_NO_ERROR && conflicts != NULL) { PTWCUtilConflictReport (conflicts); ProServerconflictsFree (conflicts); } if (result != 0) { status = ProServerWorkspaceSet (alias, current_ws_name); PT_TEST_LOG_SUCC ("ProServerWorkspaceSet()"); } ProWstringFree (current_ws_name); return PRO_TK_NO_ERROR; } /*====================================================================*\ FUNCTION: PTWCUtilBuildWSPath PURPOSE: Construct the path to the workspace, given the server and workspace name. \*====================================================================*/ ProError PTWCUtilBuildWSPath (wchar_t* server, wchar_t* ws_name, ProPath folder) { ProStringToWstring (folder, "wtws://"); ProWstringConcatenate (server, folder, PRO_VALUE_UNUSED); ProWstringConcatenate (L"/", folder, PRO_VALUE_UNUSED); ProWstringConcatenate (ws_name, folder, PRO_VALUE_UNUSED); return PRO_TK_NO_ERROR; } /*====================================================================*\ FUNCTION: PTWCUtilBuildPJLFolder PURPOSE: Construct the path to the ProjectLink folder, given the server name, project name, and folder name in the project. \*====================================================================*/ ProError PTWCUtilBuildPJLFolder (wchar_t* server, wchar_t* project, char* foldername, ProPath folder) { ProPath w_foldername; ProStringToWstring (folder, "wtpub://"); ProWstringConcatenate (server, folder, PRO_VALUE_UNUSED); ProWstringConcatenate (L"/Projects/", folder, PRO_VALUE_UNUSED); ProWstringConcatenate (project, folder, PRO_VALUE_UNUSED); ProWstringConcatenate (L"/", folder, PRO_VALUE_UNUSED); ProStringToWstring (w_foldername, foldername); ProWstringConcatenate (w_foldername, folder, PRO_VALUE_UNUSED); return PRO_TK_NO_ERROR; } /*====================================================================*\ FUNCTION: PTWCUtilBuildServerFolder PURPOSE: Construct a commonspace folder using a location. \*====================================================================*/ ProError PTWCUtilBuildServerFolder (wchar_t* server, wchar_t* folderpath, ProPath folder) { ProPath w_foldername; ProStringToWstring (folder, "wtpub://"); ProWstringConcatenate (server, folder, PRO_VALUE_UNUSED); ProWstringConcatenate (folderpath, folder, PRO_VALUE_UNUSED); return PRO_TK_NO_ERROR; } /*====================================================================*\ FUNCTION: PTWCUtilCheckinWSToFolder PURPOSE: Checkin the entire workspace. If folder is supplied it will be used as the new object "default location". \*====================================================================*/ extern ProError PTWCUtilCheckinWSToFolder (wchar_t* ws_name, ProPath folder) { ProServerCheckinOptions options; ProServerCheckinConflicts conflicts = NULL; status = ProServercheckinoptsAlloc (&options); PT_TEST_LOG_SUCC ("ProServercheckinoptsAlloc()"); if (folder != NULL) { status = ProServercheckinoptsDeflocationSet (options, folder); PT_TEST_LOG_SUCC ("ProServercheckinoptsDeflocationSet()"); } status = ProServerObjectsCheckin (NULL, options, &conflicts); PT_TEST_LOG_SUCC ("ProServerObjectsCheckin()"); if (status != PRO_TK_NO_ERROR && conflicts != NULL) { PTWCUtilConflictReport (conflicts); ProServerconflictsFree (conflicts); } return PRO_TK_NO_ERROR; } uiCmdAccessState PTWCUtilAccessIfWCServer () { wchar_t* server; wchar_t* server_class; int result; status = ProServerActiveGet (&server); if (status != PRO_TK_NO_ERROR) return ACCESS_REMOVE; status = ProServerClassGet (server, &server_class); ProWstringCompare (L"Windchill", server_class, PRO_VALUE_UNUSED, &result); ProWstringFree (server); ProWstringFree (server_class); if (result != 0) return ACCESS_REMOVE; return ACCESS_AVAILABLE; } void PTWCUtilWstringToLower (wchar_t* str) { char buff [1000]; char* result; int i = 0; ProWstringToString (buff, str); while ( buff[i] != '\0') { buff[i] = (char)tolower(buff[i]); i++; } ProStringToWstring (str, buff); }