//
// Copyright 1997 Nicholas J. Irias. All rights reserved.
//
//
// P4win.h : main header file for the P4WIN application
//
#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif
#define OS_NT 1
//--------------------
// clientapi headers:
#include <clientapi.h>
#include <clientmerge.h>
#include <i18napi.h>
#include <charcvt.h>
#include <ntmangle.h>
#include <datetime.h>
#include <enviro.h>
//--------------------
#include <wchar.h>
#include "resource.h" // main symbols
#include "P4Registry.h"
#include "P4FileStats.h"
#include "P4CommandStatus.h"
#include "StringUtil.h"
#include "Utf8String.h"
#include "P4GuiApp.h"
#include "P4ListBox.h"
#include "StatusView.h"
// RunApp() modes
enum RunAppMode
{
RA_NOWAIT, // RunApp()'s RUNAPPTHREADINFO * should be NULL
RA_WAIT, // RunApp()'s RUNAPPTHREADINFO * should be NULL
RA_THREAD, // RunApp()'s RUNAPPTHREADINFO * must point to a filled in RUNAPPTHREADINFO struct
RA_THREADWAIT, // RunApp()'s RUNAPPTHREADINFO * must point to a filled in RUNAPPTHREADINFO struct
};
// Option values for Drag & Drop to Labelview
enum _lld
{
LDD_MENU, // Display Menu
LDD_ADD, // Add selected files to label
LDD_DELETE, // Delete selected files from menu
LDD_SYNC, // Sync client to selected files in label
LDD_FILTER, // Filter Labeview on selected files
LDD_FILTERREV, // Filter Labeview on selected files and revisions
LDD_ADD2VIEW, // Add selected files to label view
LDD_NOTINUSE // Last value - must not be used!
};
// Show Depot Files
enum _sdf
{
SDF_CLIENT, // Client View of Depot
SDF_DEPOT, // Entire Depot
SDF_LOCALP4, // Local Perforce Files
SDF_LOCALTREE, // All Local Files in Client Tree
SDF_FILESNOTINDEPOT // Local File Not in Depot
};
// Sync types
enum _SyncType
{
SYNC_DONT=0, // Don't sync
SYNC_HEAD, // sync to #head
SYNC_HAVE // sync to #have
};
// File Revision ComboBox Values
enum _FileRevComboValues
{
COMBO_CHGNBR,
COMBO_LABEL,
COMBO_DATE,
COMBO_CLIENT,
};
// Client Spec Submit Options numberical values
enum _ClientSubOpts
{
UNDEFINED_SUBOPTS, // 0
SUBMITUNCHANGED, // 1
REVERTUNCHANGED, // 2
LEAVEUNCHANGED, // 3
REOPEN_MASK,
SUBMITUNCHANGED_REOPEN, // 5
REVERTUNCHANGED_REOPEN, // 6
LEAVEUNCHANGED_REOPEN, // 7
};
// IPC communication structure when requesting another instance of P4Win to
// position its depot to a given path
typedef struct _EXPANDPATH
{
int port; // offset from buf to port string
int client; // offset from buf to client string
int user; // offset from buf to user string
int path; // offset from buf to path string
int flag; // 0 -> no p4win has handled; 1-> a running p4win has handled
TCHAR buf[1]; // actually P4WIN_SHARED_MEMORY_SIZE - 5*sizeof(int) bytes
} EXPANDPATH;
#define P4WIN_SHARED_MEMORY_NAME _T("P4Win Shared Memory")
#define P4WIN_SHARED_MEMORY_SIZE 4096
// RunApp() struct for use with RA_THREAD mode
typedef struct _RUNAPPTHREADINFO // This whole struct is passed to the worker thread - not just the pParam
{
AFX_THREADPROC pfnThreadProc; // Points to the controlling function for the worker thread to be called after the CreateProcess() call; must be a non-member function [filled in by caller]
LPVOID pParam; // Points to caller's data to be passed to the worker thread [filled in by caller]
HANDLE hProcess; // Handle of Created Process [filled in by RunApp()]
} RUNAPPTHREADINFO;
// Define a path long enough that it doesnt break. The standard MAX_PATH
// defined in stdlib is fine for NT paths, but a depot path could be quite
// a bit longer. This is a magic number, since it must be used to pre-allocate
// buffers that are passed to tree control api's etc. Just need to make sure
// it's long enough that things dont break. Should I have picked 2047? or 2049?
#define LONGPATH 2048
#define LISTVIEWNAMEBUFSIZE 1028
#define DIFF_APP 1
#define EDIT_APP 2
#define MERGE_APP 3
#define P4_APP 4
#define TREE_APP 5
#define ANNOTATE_APP 6
#define PENDINGCHG 1
#define SUBMITTEDCHG 2
#define LABELVIEW 4
#define LABELNOSEL 40
#define CLIENTVIEW 5
#define USERVIEW 6
#define JOBVIEW 7
// okay, so some weird bug cropped up, god knows why.
// check out the description for job000458 for the skinny.
//
#define QQBUG_JOB000458 _T("QQ")
#ifdef _DEBUG
// TRACE control:
// #define TRACE_HERE above #include p4win.h if you want the module's
// TRACE's to fire. The code below is cribbed from AFX.H. When not
// a debug build, AfxTrace dissappears.
#ifndef TRACE_HERE
#define XTRACE 1 ? (void)0 : ::AfxTrace
#else
#define XTRACE TRACE
#endif // TRACE_HERE
#else
#define XTRACE //
#endif // _DEBUG
// A handy macro for getting at the registry from other modules
#define GET_P4REGPTR() ((CP4winApp *) AfxGetApp())->GetRegPtr()
#define SERVER_BUSY() ((CP4winApp *) AfxGetApp())->m_CS.IsServerBusy()
#define CLEAR_SERVERINFO() ((CP4winApp *) AfxGetApp())->m_CS.Reset()
#define QUEUE_COMMAND(x) ((CP4winApp *) AfxGetApp())->m_CS.QueueCommand(x)
#define GET_SERVER_LOCK(x) ((CP4winApp *) AfxGetApp())->GetServerLock(x)
#define RELEASE_SERVER_LOCK(x) ((CP4winApp *) AfxGetApp())->ReleaseServerLock(x)
#define SET_SERVERLEVEL(x) ((CP4winApp *) AfxGetApp())->m_CS.SetServerLevel(x)
#define GET_SERVERLEVEL() ((CP4winApp *) AfxGetApp())->m_CS.GetServerLevel()
#define SET_SECURITYLEVEL(x) ((CP4winApp *) AfxGetApp())->m_CS.SetSecurityLevel(x)
#define GET_SECURITYLEVEL() ((CP4winApp *) AfxGetApp())->m_CS.GetSecurityLevel()
#define SET_CLIENTROOT(x) ((CP4winApp *) AfxGetApp())->m_CS.SetClientRoot(x)
#define GET_CLIENTROOT() ((CP4winApp *) AfxGetApp())->m_CS.GetClientRoot()
#define SET_NOCASE(x) ((CP4winApp *) AfxGetApp())->m_CS.SetServerNoCase(x)
#define IS_NOCASE() ((CP4winApp *) AfxGetApp())->m_CS.IsServerNoCase()
#define APP_ABORTING() ((CP4winApp *) AfxGetApp())->m_CS.IsAppAborting()
#define REQUEST_ABORT() ((CP4winApp *) AfxGetApp())->m_CS.RequestAbort()
#define SET_APP_HALTED(x) ((CP4winApp *) AfxGetApp())->SetAppHalted(x)
#define APP_HALTED() ((CP4winApp *) AfxGetApp())->IsAppHalted()
#define SET_BUSYCURSOR() ((CP4winApp *) AfxGetApp())->SetBusyCursor()
#define GET_IMAGELIST() ((CP4winApp *) AfxGetApp())->GetImageList()
#define GET_TBIMAGELIST() ((CP4winApp *) AfxGetApp())->GetToolBarImageList()
#define GET_PWD_ERROR() ((CP4winApp *) AfxGetApp())->m_CS.GetPWDError()
#define SET_PWD_ERROR(x) ((CP4winApp *) AfxGetApp())->m_CS.SetPWDError(x)
#define GET_NOPWD_SET() ((CP4winApp *) AfxGetApp())->m_CS.GetNoPWDSet()
#define SET_NOPWD_SET(x) ((CP4winApp *) AfxGetApp())->m_CS.SetNoPWDSet(x)
#define GET_PWDNOTALLOW() ((CP4winApp *) AfxGetApp())->m_CS.GetPWDnotAllow()
#define SET_PWDNOTALLOW(x) ((CP4winApp *) AfxGetApp())->m_CS.SetPWDnotAllow(x)
#define IS_UNICODE() ((CP4winApp *) AfxGetApp())->m_CS.IsServerUnicode()
#define SET_UNICODE(x) ((CP4winApp *) AfxGetApp())->m_CS.SetServerUnicode(x)
void AddToStatus(LPCTSTR txt, StatusView level = SV_MSG, bool showDialog = false);
// The production 99.1 server is the first server to support the new source-driven
// syntax for integrate
#define LEVEL_NEWINTEG 7
// stop code litter
//
#define g_CRLF _T("\r\n")
#define LOCALDEFTEMPLATE _T("@default@")
// Structure used for calling OnIntegrate in DepotView.cpp from OldChgView.cpp
typedef struct _INTEGCHG
{
BOOL useBranch;
int changeList;
CStringList *filelist;
} INTEGCHG;
class CP4WinToolBarImageList;
class CP4ViewImageList;
// Global variable that when not zero means cancel the current operation
extern int global_cancel;
/////////////////////////////////////////////////////////////////////////////
// CP4winApp:
// See P4win.cpp for the implementation of this class
//
class CP4winApp : public CP4GuiApp
{
protected:
bool m_bGoodArgs;
void ParseArg(LPCTSTR pArg);
public:
CP4winApp();
~CP4winApp();
// Registered message for single-instance control
UINT m_WM_ACTIVATE;
UINT m_WM_SENDCMD;
UINT m_WM_RPLYCMD;
HANDLE m_hMutex;
HMODULE m_hNWSRVLOC;
CP4Registry m_RegInfo;
CP4ViewImageList *m_viewImageList;
CP4WinToolBarImageList *m_toolBarImageList;
char m_version[50];
int m_AppHalted;
int m_P4Merge; // 0==not installed, 1==installed
DWORD m_P4MergeVer; // p4merge's version eg 20052
BOOL m_WarningDialog;
BOOL m_TestFlag;
CP4CommandStatus m_CS;
BOOL m_bNoCRLF;
BOOL m_HasPlusMapping;
int m_ClientSubOpts;
CString m_ClientRoot;
CString m_ExpandPath;
BOOL m_bFindInChg;
CString m_RevHistPath;
int m_RevHistCount;
int m_RevHistMore;
int m_RevHistLast;
BOOL m_RevHistEnableShowIntegs;
BOOL m_RunClientWizOnly;
CString m_FileInfoPath;
CString m_SubmitPath; // Contains first file to submit
CStringList m_SubmitPathList; // Contain all other files to submit
CString m_DiffPath;
CString m_FindPath;
CString m_ToolsImportPath;
TCHAR m_InitialView;
int m_IdleCounter;
int m_IdleFlag;
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CP4winApp)
public:
virtual BOOL InitInstance();
virtual void WinHelp(DWORD dwData, UINT nCmd = HH_HELP_CONTEXT);
virtual BOOL OnIdle(LONG lCount);
//}}AFX_VIRTUAL
// Implementation
//{{AFX_MSG(CP4winApp)
afx_msg void OnNewWindow();
afx_msg void OnUpdateNewWindow(CCmdUI* pCmdUI);
//}}AFX_MSG
public:
inline CP4Registry *GetRegPtr() { return &m_RegInfo; }
inline BOOL IsAppHalted() { return m_AppHalted > 0; }
inline LPCTSTR GetExplorer() { return GET_P4REGPTR()->GetExplorer() ? GET_P4REGPTR()->GetAltExpl() : GET_P4REGPTR()->Get2Panes() ? _T("Explorer.exe /e,") : _T("Explorer.exe "); }
BOOL GetServerLock( int &key );
void ReleaseServerLock( int &key );
void SetAppHalted(BOOL state) { if ((m_AppHalted += state ? 1 : -1) < 0) m_AppHalted = 0; }
void StatusAdd(LPCTSTR txt, StatusView level = SV_MSG, bool showDialog = false);
void StatusAdd(CStringArray *pArray, StatusView level = SV_MSG, bool showDialog = false);
BOOL ApplyCommandLineArgs();
BOOL RunApp(int app, RunAppMode mode, HWND hWnd, BOOL isUnicode,
RUNAPPTHREADINFO *lprati,
CString &errorText,
LPCTSTR arg1=NULL, LPCTSTR arg2=NULL,
LPCTSTR arg3=NULL, LPCTSTR arg4=NULL,
LPCTSTR arg5=NULL, LPCTSTR arg6=NULL,
LPCTSTR arg7=NULL, LPCTSTR arg8=NULL,
LPCTSTR arg9=NULL, LPCTSTR arg10=NULL,
LPCTSTR arg11=NULL,LPCTSTR arg12=NULL,
LPCTSTR arg13=NULL,LPCTSTR arg14=NULL,
LPCTSTR arg15=NULL,LPCTSTR arg16=NULL,LPCTSTR arg17=NULL);
BOOL RunViewerApp(LPCTSTR app, LPCTSTR fileName);
LPCTSTR GetClientSpecField( LPCTSTR fieldname, LPCTSTR spectext );
BOOL CallP4RevisionTree(CString filepath);
BOOL CallP4A(CString annpath, CString logpath, int revnbr=-1);
CImageList *GetImageList();
CP4ViewImageList *GetViewImageList() { return m_viewImageList; }
CP4WinToolBarImageList *GetToolBarImageList() { return m_toolBarImageList; }
int GetFileImageIndex(CP4FileStats *fs, BOOL IsChangesWindow=FALSE);
void GetFileType(const CString &itemStr,int &BaseType,int &StoreType,BOOL &TypeK,BOOL &TypeW,BOOL &TypeX,BOOL &TypeO,BOOL &TypeM,BOOL &TypeL,BOOL &TypeS,int &NbrRevs,BOOL &Unknown);
BOOL Set_m_ClientRoot(LPCTSTR clientroot);
BOOL Set_m_ClientSubOpts(LPCTSTR clientSubOpts);
void OnSysColorChange();
CString BrowseForFolder(HWND hWnd, LPCTSTR startat, LPCTSTR lpszTitle, UINT nFlags);
BOOL digestIsSame(CP4FileStats *fs, BOOL retIfNotExist=FALSE, void *client=NULL);
BOOL localDigest(CP4FileStats *fs, CString *digest, BOOL retIfNotExist=FALSE, void *clientPtr=NULL);
DECLARE_MESSAGE_MAP()
};
// Text formatting functions, so multiline edit boxes can translate text with embedded
// tabs, as generated by command line clients
CString RemoveTabs(LPCTSTR text);
CString MakeCRs(LPCTSTR text);
CString MakeLFs(LPCTSTR text);
CString UnMakeCRs(LPCTSTR text);
CString PadCRs(LPCTSTR text);
CString WrapDesc(LPCTSTR text, int maxcol);
// Utility functions to perform string comparisons according
// to the case-sensitivity of the server
int nCommon(LPCTSTR str1, LPCTSTR str2);
int nCompare(LPCTSTR str1, LPCTSTR str2, int n);
int Compare(LPCTSTR str1, LPCTSTR str2);
// MBCS Utility functions to replace CString functions that don't handle MBCS
void TrimRightMBCS(CString &str, TCHAR *chars);
void ReplaceMBCS(CString &str, TCHAR oldchar, TCHAR newchar);
int FindMBCS(CString &str, TCHAR findchar, int skip=0);
int ReverseFindMBCS(CString &str, TCHAR findchar);
// Function to get a file's extension
CString GetFilesExtension(LPCTSTR filename);
// Function to compare files in TreeView order
int fCompare(LPCTSTR str1, LPCTSTR str2, BOOL ext1st=FALSE);
// Function to count the number of NewLines in a CString
int GetNbrNL(const CString *str);
// Callback function to set the initial folder for folder-browsing
INT CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData);
// Utility clipboard function
void CopyTextToClipboard(LPCTSTR txt);
// convert short file name to long
CString DemanglePath(LPCTSTR path);
// format a p4 api error
CString FormatError(Error *e, int flags = EF_NEWLINE);
// Find substring in string, not case sensitive
int FindNoCase(CString str, CString substr, int offset=0);
inline CString CharToCString(const char *c)
{
#ifdef _UNICODE
return CString(UCS2String(IS_UNICODE() != FALSE, c));
#else
return CString(c);
#endif
}
inline CharString CharFromCString(CString const &s)
{
#ifdef _UNICODE
if(IS_UNICODE())
return UTF8String(s);
else
return AnsiString(s);
#else
return s;
#endif
}
/////////////////////////////////////////////////////////////////////////////
inline CP4winApp * TheApp()
{
CP4winApp *app = dynamic_cast<CP4winApp *>(AfxGetApp());
ASSERT(app);
return app;
}
| # | Change | User | Description | Committed | |
|---|---|---|---|---|---|
| #1 | 19924 | YourUncleBob |
Populate -o //guest/perforce_software/p4win/... //guest/YourUncleBob/p4win/..... |
||
| //guest/perforce_software/p4win/main/gui/P4win.h | |||||
| #1 | 16169 | perforce_software | Move files to follow new path scheme for branches. | ||
| //guest/perforce_software/p4win/gui/P4win.h | |||||
| #1 | 8562 | Matt Attaway |
These feet never stop running. Initial commit of the P4Win source code. To the best of our knowledge this compiles and runs using the 2013.3 P4 API and VS 2010. Expect a few changes as we refine the build process. Please post any build issues to the forums. |
||