root/crypto/krb5/src/windows/leash/LeashView.h
//      **************************************************************************************
//      File:                   LeashView.h
//      By:                             Arthur David Leather
//      Created:                12/02/98
//      Copyright               @1998 Massachusetts Institute of Technology - All rights reserved.
//      Description:    H file for LeashView.cpp. Contains variables and functions
//                                      for the Leash FormView
//
//      History:
//
//      MM/DD/YY        Inits   Description of Change
//      12/02/98        ADL             Original
//      **************************************************************************************


#if !defined(AFX_LeashVIEW_H__6F45AD99_561B_11D0_8FCF_00C04FC2A0C2__INCLUDED_)
#define AFX_LeashVIEW_H__6F45AD99_561B_11D0_8FCF_00C04FC2A0C2__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

#define GOOD_TICKETS    1  // Don't change this value
#define EXPIRED_TICKETS 2  // Don't change this value
#define TICKETS_LOW             3
#define ONE_SECOND              1000
#define SMALL_ICONS     16
#define LARGE_ICONS     32

#define UPDATE_DISPLAY_TIME 60  //seconds

#define ACTIVE_CLOCK          0
#define LOW_CLOCK             1
#define EXPIRED_CLOCK         2
#define ACTIVE_TICKET         3
#define LOW_TICKET            4
#define EXPIRED_TICKET        5
#define TICKET_NOT_INSTALLED  6
#define ACTIVE_PARENT_NODE    7
#define LOW_PARENT_NODE       8
#define EXPIRED_PARENT_NODE   9
#define NONE_PARENT_NODE      10
#define LOW_TRAY_ICON         11
#define EXPIRED_TRAY_ICON     12
#define ACTIVE_TRAY_ICON      13
#define NONE_TRAY_ICON        14
#define TKT_ADDRESS           15
#define TKT_SESSION           16
#define TKT_ENCRYPTION        17
#define IMAGE_COUNT           18

#define NODE_IS_EXPANDED 2

#define CX_BORDER   1
#define CY_BORDER   1

#ifdef NO_TICKETS
#undef NO_TICKETS // XXX - this is evil but necessary thanks to silliness...
#endif

#define WM_TRAYICON (WM_USER+100)
#define WM_WARNINGPOPUP (WM_USER+101)

enum ticketTimeLeft{NO_TICKETS, ZERO_MINUTES_LEFT, FIVE_MINUTES_LEFT, TEN_MINUTES_LEFT,
                                        FIFTEEN_MINUTES_LEFT, TWENTY_MINUTES_LEFT, PLENTY_OF_TIME,
                    NOT_INSTALLED};
// Don't change 'NO_TICKET's' value

class CLeashDebugWindow;
class ViewColumnInfo
{
public:
    const char * m_name;
    int m_enabled;
    int m_id;
    int m_columnWidth;
};

enum eViewColumn {
    PRINCIPAL,
    TIME_ISSUED,
    RENEWABLE_UNTIL,
    VALID_UNTIL,
    ENCRYPTION_TYPE,
    TICKET_FLAGS,
    CACHE_NAME,
    NUM_VIEW_COLUMNS
};

class CCacheDisplayData
{
public:
    CCacheDisplayData(const char *ccache_name) :
      m_next(NULL),
      m_ccacheName(strdup(ccache_name)),
      m_index(-1),
      m_focus(-1),
      m_expanded(0),
      m_selected(0),
      m_isRenewable(0),
      m_isDefault(0)
    {
    }

    ~CCacheDisplayData()
    {
        if (m_ccacheName)
            free(m_ccacheName);
    }

    CCacheDisplayData *m_next;
    char *m_ccacheName;
    int m_index;               // item index in list view
    int m_focus;               // sub-item with focus
    unsigned int m_expanded;   // true when each individual ticket is displayed
    unsigned int m_selected;   // true when this ccache is selected
    unsigned int m_isRenewable; // true when tgt is renewable
    unsigned int m_isDefault;  // true when this is the default ccache
};

struct ListItemInfo
{
    ListItemInfo() : m_font(NULL), m_durationFont(NULL) {}
    HFONT m_durationFont; // For renewable/valid until; italic when expired
    HFONT m_font;         // For all other items
};

class CLeashView : public CListView
{
private:
////@#+Remove
    CLeashDebugWindow*  m_pDebugWindow;
    CCacheDisplayData*  m_ccacheDisplay;
        CImageList                      m_imageList;
        CWinApp*                        m_pApp;
        HTREEITEM                       m_hPrincipal;
        HTREEITEM                       m_hKerb5;
    HTREEITEM           m_hk5tkt;
        TV_INSERTSTRUCT         m_tvinsert;
        HMENU                           m_hMenu;
    BOOL                                m_startup;
        BOOL                            m_isMinimum;
        BOOL                            m_debugStartUp;
        BOOL                            m_alreadyPlayed;
    INT                                 m_upperCaseRealm;
        INT                                     m_destroyTicketsOnExit;
        INT                                     m_debugWindow;
        INT                                     m_largeIcons;
        INT                                     m_lowTicketAlarm;
        INT                                     m_hPrincipalState;
        INT                                     m_hKerb5State;
    CString*            m_pWarningMessage;
    BOOL                m_bIconAdded;
    BOOL                m_bIconDeleted;
    HFONT               m_BaseFont;
    HFONT               m_BoldFont;
    HFONT               m_ItalicFont;
    HFONT               m_BoldItalicFont;
    ListItemInfo*       m_aListItemInfo;

    static ViewColumnInfo sm_viewColumns[NUM_VIEW_COLUMNS];

    static INT                  m_autoRenewTickets;
    static INT          m_ticketStatusKrb5;
    static INT          m_autoRenewalAttempted;
        static INT                      m_warningOfTicketTimeLeftKrb5;
    static INT                  m_warningOfTicketTimeLeftLockKrb5;
    static INT                  m_updateDisplayCount;
    static INT          m_alreadyPlayedDisplayCount;
    static time_t               m_ticketTimeLeft;
    static BOOL                 m_lowTicketAlarmSound;
    static LONG         m_timerMsgNotInProgress;

    void ToggleViewColumn(eViewColumn viewOption);
        VOID ResetTreeNodes();
    VOID ApplicationInfoMissingMsg();
    VOID GetScrollBarState(CSize sizeClient, CSize& needSb,
                               CSize& sizeRange, CPoint& ptMove,
                           BOOL bInsideClient);
    VOID UpdateBars();
    VOID GetScrollBarSizes(CSize& sizeSb);
    BOOL GetTrueClientSize(CSize& size, CSize& sizeSb);
    HFONT GetSubItemFont(int iItem, int iSubItem);

    //void   GetRowWidthHeight(CDC* pDC, LPCSTR theString, int& nRowWidth,
    //                         int& nRowHeight, int& nCharWidth);
    static VOID AlarmBeep();
    static VOID CALLBACK EXPORT TimerProc(HWND hWnd, UINT nMsg, UINT_PTR nIDEvent,
                                          DWORD dwTime);
    static VOID UpdateTicketTime(TICKETINFO& ticketinfo);
    static INT  GetLowTicketStatus(int);
    static time_t       LeashTime();
    static BOOL IsExpired(TicketList *ticket);
    static BOOL IsExpired(TICKETINFO *info);
    static VOID AddDisplayItem(CListCtrl &list,
                               CCacheDisplayData *elem,
                               int iItem,
                               char *principal,
                               time_t issued,
                               time_t valid_until,
                               time_t renew_until,
                               char *encTypes,
                               unsigned long flags,
                               char *cache_name);

    void   SetTrayIcon(int nim, int state=0);
    void   SetTrayText(int nim, CString tip);

    BOOL   UpdateDisplay();
    static UINT InitTicket(void *);
    static UINT RenewTicket(void *);
    static UINT ImportTicket(void *);
    // Queue a warning popup message.
    // This is a workaround to the MFC deficiency that you cannot safely create
    // a modal dialog while processing messages within AfxPreTranslateMessage()
    // returns TRUE if message is queued successfully.
    BOOL PostWarningMessage(const CString& message);
    afx_msg LRESULT OnWarningPopup(WPARAM wParam, LPARAM lParam);

    BOOL    IsExpanded(TICKETINFO *);

protected: // create from serialization only
        DECLARE_DYNCREATE(CLeashView)

// Attributes
public:
    CLeashView();
        //LeashDoc* GetDocument();

        //{{AFX_DATA(CLeashView)
        enum { IDD = IDD_DIALOG1 };
                // NOTE: the ClassWizard will add data members here
        //}}AFX_DATA

// Operations
public:

// Overrides
        // ClassWizard generated virtual function overrides
        //{{AFX_VIRTUAL(CLeashView)
        public:
        virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
        virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
        virtual VOID OnInitialUpdate();
        virtual BOOL PreTranslateMessage(MSG* pMsg);
        protected:
        virtual VOID OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView);
        //}}AFX_VIRTUAL

// Implementation
public:
        virtual ~CLeashView();

#ifdef _DEBUG
        virtual VOID AssertValid() const;
        virtual VOID Dump(CDumpContext& dc) const;
#endif

// Generated message map functions
protected:
        //{{AFX_MSG(CLeashView)
    afx_msg VOID OnItemexpandedTreeview(NMHDR* pNMHDR, LRESULT* pResult);
        afx_msg INT OnCreate(LPCREATESTRUCT lpCreateStruct);
        afx_msg VOID OnShowWindow(BOOL bShow, UINT nStatus);
    afx_msg VOID OnClose(void);
        afx_msg VOID OnInitTicket();
        afx_msg VOID OnRenewTicket();
        afx_msg VOID OnDestroyTicket();
        afx_msg VOID OnMakeDefault();
        afx_msg VOID OnChangePassword();
        afx_msg VOID OnUpdateDisplay();
        afx_msg VOID OnSynTime();
        afx_msg VOID OnDebugMode();
        afx_msg VOID OnLargeIcons();
        afx_msg VOID OnTimeIssued();
        afx_msg VOID OnValidUntil();
        afx_msg VOID OnRenewableUntil();
        afx_msg VOID OnShowTicketFlags();
        afx_msg VOID OnEncryptionType();
        afx_msg VOID OnCcacheName();
        afx_msg VOID OnUppercaseRealm();
        afx_msg VOID OnKillTixOnExit();
        afx_msg VOID OnDestroy();
        afx_msg VOID OnUpdateDestroyTicket(CCmdUI* pCmdUI);
        afx_msg VOID OnUpdateInitTicket(CCmdUI* pCmdUI);
        afx_msg VOID OnUpdateRenewTicket(CCmdUI* pCmdUI);
        afx_msg VOID OnUpdateTimeIssued(CCmdUI* pCmdUI);
        afx_msg VOID OnUpdateValidUntil(CCmdUI* pCmdUI);
        afx_msg VOID OnUpdateRenewableUntil(CCmdUI* pCmdUI);
        afx_msg VOID OnUpdateShowTicketFlags(CCmdUI* pCmdUI);
        afx_msg VOID OnUpdateEncryptionType(CCmdUI* pCmdUI);
        afx_msg VOID OnUpdateCcacheName(CCmdUI* pCmdUI);
        afx_msg VOID OnUpdateUppercaseRealm(CCmdUI* pCmdUI);
        afx_msg VOID OnUpdateKillTixOnExit(CCmdUI* pCmdUI);
        afx_msg VOID OnUpdateLowTicketAlarm(CCmdUI* pCmdUI);
        afx_msg VOID OnUpdateAutoRenew(CCmdUI* pCmdUI);
        afx_msg VOID OnUpdateMakeDefault(CCmdUI* pCmdUI);
        afx_msg VOID OnAppAbout();
        afx_msg VOID OnUpdateDebugMode(CCmdUI* pCmdUI);
        afx_msg VOID OnUpdateCfgFiles(CCmdUI* pCmdUI);
        afx_msg VOID OnKrb5Properties();
        afx_msg void OnLeashProperties();
        afx_msg void OnLeashRestore();
        afx_msg void OnLeashMinimize();
        afx_msg void OnLowTicketAlarm();
        afx_msg void OnUpdateKrb5Properties(CCmdUI* pCmdUI);
    afx_msg void OnKrbProperties();
        afx_msg void OnUpdateProperties(CCmdUI* pCmdUI);
        afx_msg void OnHelpKerberos();
        afx_msg void OnHelpLeash32();
        afx_msg void OnHelpWhyuseleash32();
    afx_msg void OnSysColorChange();
    afx_msg void OnAutoRenew();
        afx_msg LRESULT OnGoodbye(WPARAM wParam, LPARAM lParam);
        afx_msg LRESULT OnTrayIcon(WPARAM wParam, LPARAM lParam);
    afx_msg LRESULT OnObtainTGTWithParam(WPARAM wParam, LPARAM lParam);
    afx_msg void OnItemChanged(NMHDR* pNmHdr, LRESULT* pResult);
    //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnLvnItemchanging(NMHDR *pNMHDR, LRESULT *pResult);
    afx_msg void OnLvnItemActivate(NMHDR *pNMHDR, LRESULT *pResult);
    afx_msg void OnLvnKeydown(NMHDR *pNMHDR, LRESULT *pResult);
    afx_msg void OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);
};

/*
#ifndef _DEBUG  // debug version in CLeashView.cpp
inline LeashDoc* CLeashView::GetDocument()
   { return (LeashDoc*)m_pDocument; }
#endif
*/

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_LeashVIEW_H__6F45AD99_561B_11D0_8FCF_00C04FC2A0C2__INCLUDED_)