|
|
//____________________________________________________________________________
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995 - 1996.
//
// File: sdetails.cxx
//
// Contents: implementation of IShellDetails
//
// Classes: CJobsSD
//
// Functions:
//
// History: 1/4/1996 RaviR Created
//
//____________________________________________________________________________
#include "..\pch\headers.hxx"
#pragma hdrstop
#include "dbg.h"
#include "macros.h"
#include "resource.h"
#include "dll.hxx"
#include "jobidl.hxx"
#include "util.hxx"
#include "common.hxx"
//
// extern
//
extern HINSTANCE g_hInstance;
//////////////////////////////////////////////////////////////////////////////
// Forward declaration of local functions
//
BOOL GetLocaleDateTimeString( SYSTEMTIME* pst, DWORD dwDateFlags, DWORD dwTimeFlags, TCHAR szBuff[], int cchBuffLen, LPSHELLDETAILS lpDetails);
//////////////////////////////////////////////////////////////////////////////
//
// Define the columns (used by CJobsSD::GetDetailsOf)
//
struct COL_INFO { UINT idString; int fmt; UINT cxChar; };
const COL_INFO c_ColumnHeaders[] = { {IDS_NAME, LVCFMT_LEFT, 30}, {IDS_SCHEDULE, LVCFMT_LEFT, 20}, {IDS_NEXTRUNTIME, LVCFMT_LEFT, 15}, {IDS_LASTRUNTIME, LVCFMT_LEFT, 15}, {IDS_STATUS, LVCFMT_LEFT, 25}, {IDS_LASTEXITCODE, LVCFMT_RIGHT, 15}, {IDS_CREATOR, LVCFMT_LEFT, 15} };
//____________________________________________________________________________
//
// Class: CJobsSD
//
// Purpose: Provide IShellDetails interface to Job Folder objects.
//
// History: 1/24/1996 RaviR Created
//____________________________________________________________________________
class CJobsSD : public IShellDetails { public: CJobsSD(HWND hwnd) : m_ulRefs(1), m_hwnd(hwnd) {} ~CJobsSD() {}
// IUnknown methods
DECLARE_STANDARD_IUNKNOWN;
// IShellDetails methods
STDMETHOD(GetDetailsOf)(LPCITEMIDLIST pidl, UINT iColumn, LPSHELLDETAILS pDetails); STDMETHOD(ColumnClick)(UINT iColumn);
private: HWND m_hwnd; CDllRef m_DllRef; };
//____________________________________________________________________________
//
// Member: CJobsSD::IUnknown methods
//____________________________________________________________________________
IMPLEMENT_STANDARD_IUNKNOWN(CJobsSD)
STDMETHODIMP CJobsSD::QueryInterface(REFIID riid, LPVOID* ppvObj) { if (IsEqualIID(IID_IUnknown, riid) || IsEqualIID(IID_IShellDetails, riid)) { *ppvObj = (IUnknown*)(IShellDetails*) this; this->AddRef(); return S_OK; } else { *ppvObj = NULL; return E_NOINTERFACE; } }
inline HRESULT CopyToSTRRET(STRRET &str, LPTSTR pszIn) { UINT uiByteLen = (lstrlen(pszIn) + 1) * sizeof(TCHAR);
str.uType = STRRET_WSTR;
str.pOleStr = (LPWSTR) SHAlloc(uiByteLen);
if (str.pOleStr == NULL) { CHECK_HRESULT(E_OUTOFMEMORY); return E_OUTOFMEMORY; }
CopyMemory(str.pOleStr, pszIn, uiByteLen);
return S_OK; }
//____________________________________________________________________________
//
// Member: CJobsSD::GetDetailsOf
//
// Arguments: [pidl] -- IN
// [iColumn] -- IN
// [lpDetails] -- IN
//
// Returns: HRESULT.
//
// History: 1/8/1996 RaviR Created
//
//____________________________________________________________________________
STDMETHODIMP CJobsSD::GetDetailsOf( LPCITEMIDLIST pidl, UINT iColumn, LPSHELLDETAILS lpDetails) { // TRACE(CJobsSD, GetDetailsOf);
HRESULT hr = S_OK; TCHAR tcBuff[SCH_XBIGBUF_LEN] = TEXT("");
if (iColumn >= COLUMN_COUNT) { return E_FAIL; }
if (NULL == pidl) { //
// Caller wants strings for the column headers
//
LoadString(g_hInstance, c_ColumnHeaders[iColumn].idString, tcBuff, SCH_XBIGBUF_LEN);
lpDetails->fmt = c_ColumnHeaders[iColumn].fmt; lpDetails->cxChar = c_ColumnHeaders[iColumn].cxChar; } else { CJobID & jid = *(PJOBID)pidl;
//
// Fill tcBuff with the string describing column iColumn of
// object jid. If jid represents a template object, only the
// name column is not blank.
//
if (!jid.IsTemplate() || iColumn == COLUMN_NAME) { switch (iColumn) { case COLUMN_NAME: { StringCchCopy(tcBuff, SCH_XBIGBUF_LEN, jid.GetName()); break; } case COLUMN_SCHEDULE: { if (jid.IsJobFlagOn(TASK_FLAG_DISABLED) == TRUE) { LoadString(g_hInstance, IDS_DISABLED, tcBuff, SCH_XBIGBUF_LEN); } else if (jid.GetTriggerCount() > 1) { LoadString(g_hInstance, IDS_MULTIPLE_TRIGGERS, tcBuff, SCH_XBIGBUF_LEN); } else { hr = GetTriggerStringFromTrigger(&jid.GetTrigger(), tcBuff, SCH_XBIGBUF_LEN, lpDetails); } break; } case COLUMN_LASTRUNTIME: { SYSTEMTIME &st = jid.GetLastRunTime(); if (st.wYear == 0 || st.wMonth == 0 || st.wDay == 0) { LoadString(g_hInstance, IDS_NEVER, tcBuff, SCH_XBIGBUF_LEN); } else { GetLocaleDateTimeString(&st, DATE_SHORTDATE, 0, tcBuff, SCH_XBIGBUF_LEN, lpDetails); } break; }
case COLUMN_NEXTRUNTIME: jid.GetNextRunTimeString(tcBuff, SCH_XBIGBUF_LEN, FALSE, lpDetails); break; case COLUMN_STATUS: { ULONG ids = 0;
if (jid.IsRunning()) { ids = IDS_RUNNING; } else if (jid.WasRunMissed()) { ids = IDS_MISSED; } else if (jid.DidJobStartFail()) { ids = IDS_START_FAILED; } else if(jid.DidJobBadAcct()) { ids = IDS_BAD_ACCT; } else if(jid.DidJobRestAcct()) { ids = IDS_REST_ACCT; }
if (ids) { LoadString(g_hInstance, ids, tcBuff, SCH_XBIGBUF_LEN); } break; }
case COLUMN_LASTEXITCODE: StringCchPrintf(tcBuff, SCH_XBIGBUF_LEN, TEXT("0x%x"), jid.GetExitCode()); break; case COLUMN_CREATOR: StringCchCopy(tcBuff, SCH_XBIGBUF_LEN, jid.GetCreator()); break; } } }
hr = CopyToSTRRET(lpDetails->str, tcBuff);
return hr; }
//____________________________________________________________________________
//
// Member: CJobsSD::ColumnClick
//
// Arguments: [iColumn] -- IN
//
// Returns: STDMETHODIMP
//
// History: 1/8/1996 RaviR Created
//
//____________________________________________________________________________
STDMETHODIMP CJobsSD::ColumnClick( UINT iColumn) { TRACE(CJobsSD, ColumnClick);
ShellFolderView_ReArrange(m_hwnd, iColumn);
return S_OK; }
//
//Define the UNICODE RLM control character.
//
#define RLM TEXT("\x200f")
//+-------------------------------------------------------------------------
//
// Function: GetLocaleDateTimeString, public
//
// Synopsis: Use the proper locale-formatted time and date
//
// History: 07/09/95 RaviR Created.
//
//--------------------------------------------------------------------------
BOOL GetLocaleDateTimeString( SYSTEMTIME* pst, DWORD dwDateFlags, DWORD dwTimeFlags, TCHAR szBuff[], int cchBuffLen, LPSHELLDETAILS lpDetails) { if (pst->wYear == 0 || pst->wMonth == 0 || pst->wDay == 0) { szBuff = TEXT('\0'); return TRUE; }
LCID lcid = GetUserDefaultLCID(); TCHAR Time[150] = TEXT(""); TCHAR Date[150] = TEXT("");
if (0 == GetTimeFormat(lcid, dwTimeFlags, pst, NULL, Time, 150)) { DEBUG_OUT_LASTERROR; return FALSE; }
if (lpDetails) { if (lpDetails->fmt & LVCFMT_RIGHT_TO_LEFT) { dwDateFlags |= DATE_RTLREADING; } else if (lpDetails->fmt & LVCFMT_LEFT_TO_RIGHT) { dwDateFlags |= DATE_LTRREADING; } }
if (0 == GetDateFormat(lcid, dwDateFlags, pst, NULL, Date, 150)) { DEBUG_OUT_LASTERROR; return FALSE; }
//
//Force the time to appears as if it is preceded by BiDi character.
//
if (dwDateFlags & DATE_RTLREADING) { StringCchCopy(szBuff, cchBuffLen, RLM); StringCchCat(szBuff, cchBuffLen, Time);
} else StringCchCopy(szBuff,cchBuffLen, Time);
StringCchCat(szBuff, cchBuffLen, TEXT(" ")); StringCchCat(szBuff, cchBuffLen, Date);
return TRUE; }
//____________________________________________________________________________
//
// Function: CJobsShellDetails_Create
//
// Synopsis: S
//
// Arguments: [hwnd] -- IN
// [riid] -- IN
// [ppvObj] -- IN
//
// Returns: HRESULT
//
// History: 1/24/1996 RaviR Created
//____________________________________________________________________________
HRESULT JFGetShellDetails( HWND hwnd, LPVOID* ppvObj) { CJobsSD* pObj = new CJobsSD(hwnd);
if (NULL == pObj) { return E_OUTOFMEMORY; }
HRESULT hr = pObj->QueryInterface(IID_IShellDetails, ppvObj);
pObj->Release();
return hr; }
|