// // 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. |