#include <windows.h>
#include "main.h"
IGWSession* pIGWSession;
IGWAccount* pIGWAccount;
HINSTANCE ghInst;
HANDLE hResultDlg;
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd)
{
ghInst = hInst;
DialogBox(hInst, MAKEINTRESOURCE(IDD_MAIN), NULL, (DLGPROC)MainWndProc);
return(TRUE);
}
LONG APIENTRY MainWndProc(HWND hwndDlg, UINT message, WPARAM wParam, LONG lParam)
{
switch(message) {
case WM_INITDIALOG: {
InitGWSession();
InitDlgControls(hwndDlg);
break;
}
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDOK:
DoQuery(hwndDlg);
break;
case IDCANCEL:
DeinitGWSession();
EndDialog(hwndDlg, IDCANCEL);
break;
case IDC_FIELD:
if(HIWORD(wParam) == CBN_SELCHANGE)
OnFieldSelectionChanged(hwndDlg);
break;
}
break;
case WM_CLOSE:
ShowWindow(hwndDlg, SW_HIDE);
DeinitGWSession();
EndDialog(hwndDlg, 0);
break;
}
return(0);
}
void InitDlgControls(HWND hwndDlg)
{
HWND hwndField, hwndOperator, hwndExpression;
int i;
hwndField = GetDlgItem(hwndDlg, IDC_FIELD);
hwndOperator = GetDlgItem(hwndDlg, IDC_KEY);
hwndExpression = GetDlgItem(hwndDlg, IDC_ITEM);
for(i=0; i<MAX_FIELDS; i++)
SendMessage(hwndField, CB_ADDSTRING, 0, (LPARAM)fields[i].name);
for(i=0; i<MAX_UNARY_STATUS; i++)
SendMessage(hwndOperator, CB_ADDSTRING, 0, (LPARAM)stUnary[i]);
SendMessage(hwndField, CB_SETCURSEL, 0, 0);
SendMessage(hwndOperator, CB_SETCURSEL, 0, 0);
EnableWindow(hwndOperator, FALSE);
EnableWindow(hwndExpression, FALSE);
}
BOOL InitGWSession()
{
DIGWAccount* pDIGWAccount;
VARIANT vUserId, vCmdLine, vPassword, vWhenToPrompt, vReserved;
CoInitialize(NULL);
if(FAILED(CoCreateInstance(CLSID_GroupWare, NULL, CLSCTX_INPROC_SERVER |
CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER, IID_IGWSession, (void**)&pIGWSession))) {
ErrorMessage("Could not create session object");
return FALSE;
}
VariantInit(&vUserId);
VariantInit(&vCmdLine);
VariantInit(&vPassword);
VariantInit(&vWhenToPrompt);
VariantInit(&vReserved);
V_VT(&vUserId) = VT_EMPTY;
V_VT(&vCmdLine) = VT_EMPTY;
V_VT(&vPassword) = VT_EMPTY;
V_VT(&vWhenToPrompt) = VT_I2;
V_VT(&vReserved) = VT_EMPTY;
V_I2(&vWhenToPrompt) = 0;
if(!SUCCEEDED(pIGWSession->Login(vUserId, vCmdLine, vPassword, vWhenToPrompt, vReserved, &pDIGWAccount))) {
ErrorMessage("Couldn't login to session");
return FALSE;
}
if(FAILED(pDIGWAccount->QueryInterface(IID_IGWAccount, (LPVOID*)&pIGWAccount))) {
ErrorMessage("QueryInterface on IID_IGWAccount Failed");
return FALSE;
}
pDIGWAccount->Release();
return TRUE;
}
void DeinitGWSession()
{
pIGWAccount->Release();
pIGWSession->Release();
CoUninitialize();
}
void OnFieldSelectionChanged(HWND hwndDlg)
{
HWND hwndField, hwndOperator, hwndItem;
int i, sel;
hwndField = GetDlgItem(hwndDlg, IDC_FIELD);
hwndOperator = GetDlgItem(hwndDlg, IDC_OPERATOR);
hwndItem = GetDlgItem(hwndDlg, IDC_ITEM);
sel = SendMessage(hwndField, CB_GETCURSEL, 0, 0);
switch(fields[sel].type) {
case GW_TEXT_FIELD:
EnableWindow(hwndOperator, TRUE);
EnableWindow(hwndItem, TRUE);
SendMessage(hwndOperator, CB_RESETCONTENT, 0, 0);
SendMessage(hwndItem, CB_RESETCONTENT, 0, 0);
for(i=0; i<MAX_TEXT_OPERATORS; i++)
SendMessage(hwndOperator, CB_ADDSTRING, 0, (LPARAM)opText[i]);
SendMessage(hwndOperator, CB_SETCURSEL, 0, 0);
break;
case GW_NUMERIC_FIELD:
EnableWindow(hwndOperator, TRUE);
EnableWindow(hwndItem, TRUE);
SendMessage(hwndOperator, CB_RESETCONTENT, 0, 0);
SendMessage(hwndItem, CB_RESETCONTENT, 0, 0);
for(i=0; i<MAX_NUMERIC_OPERATORS; i++)
SendMessage(hwndOperator, CB_ADDSTRING, 0, (LPARAM)opNumeric[i]);
SendMessage(hwndOperator, CB_SETCURSEL, 0, 0);
break;
case GW_DATE_FIELD:
SendMessage(hwndOperator, CB_RESETCONTENT, 0, 0);
SendMessage(hwndItem, CB_RESETCONTENT, 0, 0);
for(i=0; i<MAX_DATE_OPERATORS; i++)
SendMessage(hwndOperator, CB_ADDSTRING, 0, (LPARAM)opDate[i]);
for(i=0; i<MAX_DATE_CONSTANTS; i++)
SendMessage(hwndItem, CB_ADDSTRING, 0, (LPARAM)cDate[i]);
SendMessage(hwndOperator, CB_SETCURSEL, 0, 0);
SendMessage(hwndItem, CB_SETCURSEL, 0, 0);
EnableWindow(hwndOperator, TRUE);
EnableWindow(hwndItem, TRUE);
break;
case GW_UNARY_FIELD:
SendMessage(hwndOperator, CB_RESETCONTENT, 0, 0);
SendMessage(hwndItem, CB_RESETCONTENT, 0, 0);
for(i=0; i<MAX_UNARY_STATUS; i++)
SendMessage(hwndOperator, CB_ADDSTRING, 0, (LPARAM)stUnary[i]);
SendMessage(hwndOperator, CB_SETCURSEL, 0, 0);
EnableWindow(hwndOperator, FALSE);
EnableWindow(hwndItem, FALSE);
break;
case GW_BOXTYPE_FIELD:
EnableWindow(hwndOperator, TRUE);
EnableWindow(hwndItem, TRUE);
SendMessage(hwndOperator, CB_RESETCONTENT, 0, 0);
SendMessage(hwndItem, CB_RESETCONTENT, 0, 0);
for(i=0; i<MAX_BOXTYPE_OPERATORS; i++)
SendMessage(hwndOperator, CB_ADDSTRING, 0, (LPARAM)opBoxType[i]);
for(i=0; i<MAX_BOXTYPE_CONSTANTS; i++)
SendMessage(hwndItem, CB_ADDSTRING, 0, (LPARAM)cBoxType[i]);
SendMessage(hwndOperator, CB_SETCURSEL, 0, 0);
SendMessage(hwndItem, CB_SETCURSEL, 0, 0);
break;
case GW_PRIORITY_FIELD:
EnableWindow(hwndOperator, TRUE);
EnableWindow(hwndItem, TRUE);
SendMessage(hwndOperator, CB_RESETCONTENT, 0, 0);
SendMessage(hwndItem, CB_RESETCONTENT, 0, 0);
for(i=0; i<MAX_PRIORITY_OPERATORS; i++)
SendMessage(hwndOperator, CB_ADDSTRING, 0, (LPARAM)opPriority[i]);
for(i=0; i<MAX_PRIORITY_CONSTANTS; i++)
SendMessage(hwndItem, CB_ADDSTRING, 0, (LPARAM)cPriority[i]);
SendMessage(hwndOperator, CB_SETCURSEL, 0, 0);
SendMessage(hwndItem, CB_SETCURSEL, 0, 0);
break;
case GW_ATTACHMENT_FIELD:
EnableWindow(hwndOperator, TRUE);
EnableWindow(hwndItem, TRUE);
SendMessage(hwndOperator, CB_RESETCONTENT, 0, 0);
SendMessage(hwndItem, CB_RESETCONTENT, 0, 0);
for(i=0; i<MAX_ATTACHTYPE_OPERATORS; i++)
SendMessage(hwndOperator, CB_ADDSTRING, 0, (LPARAM)opAttachType[i]);
for(i=0; i<MAX_ATTACHTYPE_CONSTANTS; i++)
SendMessage(hwndItem, CB_ADDSTRING, 0, (LPARAM)cAttachment[i]);
SendMessage(hwndOperator, CB_SETCURSEL, 0, 0);
SendMessage(hwndItem, CB_SETCURSEL, 0, 0);
break;
};
}
void DoQuery(HWND hwndDlg)
{
HWND hwndField, hwndKey, hwndItem;
DIGWQuery* pDIGWQuery;
IGWQuery*pIGWQuery;
char* pszExpression;
char* pszItem;
char szKey[14];
VARIANT_BOOL bCompleted = FALSE;
BSTR bStr;
int fLen, kLen, iLen, fSel, kSel;
HCURSOR hCursor;
pIGWAccount->CreateQuery(&pDIGWQuery);
if(pDIGWQuery && SUCCEEDED(pDIGWQuery->QueryInterface(IID_IGWQuery, (void**)&pIGWQuery))) {
pDIGWQuery->Release();
hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
hwndField = GetDlgItem(hwndDlg, IDC_SEARCH);
hwndKey = GetDlgItem(hwndDlg, IDC_KEY);
hwndItem = GetDlgItem(hwndDlg, IDC_ITEM);
fSel = SendMessage(hwndField, CB_GETCURSEL, 0, 0);
kSel = SendMessage(hwndKey, CB_GETCURSEL, 0, 0);
switch(fields[fSel].type) {
case GW_TEXT_FIELD:
lstrcpy(szKey, opText[kSel]);
break;
case GW_NUMERIC_FIELD:
lstrcpy(szKey, opNumeric[kSel]);
break;
case GW_DATE_FIELD:
lstrcpy(szKey, opDate[kSel]);
break;
case GW_UNARY_FIELD:
szKey[0] = NULL;
break;
case GW_BOXTYPE_FIELD:
lstrcpy(szKey, opBoxType[kSel]);
break;
case GW_PRIORITY_FIELD:
lstrcpy(szKey, opPriority[kSel]);
break;
case GW_ATTACHMENT_FIELD:
lstrcpy(szKey, opAttachType[kSel]);
break;
}
fLen = lstrlen(fields[fSel].name);
kLen = lstrlen(szKey);
iLen = SendMessage(hwndItem, WM_GETTEXTLENGTH, 0, 0) + 1;
pszItem = new char[iLen];
pszExpression = new char[fLen + iLen + kLen + 10];
SendMessage(hwndItem, WM_GETTEXT, iLen, (LPARAM)pszItem);
lstrcpy(pszExpression, "(");
lstrcat(pszExpression, fields[fSel].name);
lstrcat(pszExpression, szKey);
switch(fields[fSel].type) {
case GW_TEXT_FIELD:
lstrcat(pszExpression, "\"");
lstrcat(pszExpression, pszItem);
lstrcat(pszExpression, "\"");
break;
case GW_DATE_FIELD:
case GW_NUMERIC_FIELD:
case GW_BOXTYPE_FIELD:
case GW_PRIORITY_FIELD:
case GW_ATTACHMENT_FIELD:
lstrcat(pszExpression, pszItem);
break;
}
lstrcat(pszExpression, ")");
bStr = SysAllocString(TO_OLE_STRING(pszExpression));
pIGWQuery->put_Expression(bStr);
pIGWQuery->Start();
while(bCompleted == FALSE) {
pIGWQuery->get_Completed(&bCompleted);
pIGWQuery->Refresh();
}
ShowResults(hwndDlg, pIGWQuery, pszExpression);
pIGWQuery->Release();
delete[] pszExpression;
delete[] pszItem;
SetCursor(hCursor);
}
}
void ShowResults(HWND hwndDlg, IGWQuery* pIGWQuery, char* pszExpression)
{
HWND hwndLView, hwndNFound, hwndExpression;
DIGWMessageList* pDIGWMessageList;
DIGWMessage* pDIGWMessage;
DIGWFormattedText* pDIGWFormattedText;
DIGWFolders* pDIGWFolders;
DIGWFolder* pDIGWFolder;
IGWMessageList* pIGWMessageList;
IGWMessage* pIGWMessage;
IGWFormattedText* pIGWFormattedText;
IGWFolders* pIGWFolders;
IGWFolder* pIGWFolder;
VARIANT vIdx, vDate;
long lCount, fCount;
BSTR bStr;
LV_ITEM lvItem;
DATE crDate;
char num[5];
char szFolders[300];
if(!IsWindow(hResultDlg)) {
hResultDlg = CreateDialog(ghInst, MAKEINTRESOURCE(IDD_RESULTS), hwndDlg, (DLGPROC)ResultDlgProc);
}
hwndLView = GetDlgItem(hResultDlg, IDC_RESULTS);
hwndNFound = GetDlgItem(hResultDlg, IDC_NUMFOUND);
hwndExpression = GetDlgItem(hResultDlg, IDC_QUERY_EXPRESSION);
ListView_DeleteAllItems(hwndLView);
SendMessage(hwndExpression, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)pszExpression);
pIGWQuery->get_QueryMessages(&pDIGWMessageList);
if(pDIGWMessageList && SUCCEEDED(pDIGWMessageList->QueryInterface(IID_IGWMessageList, (void**)&pIGWMessageList))) {
pDIGWMessageList->Release();
pIGWMessageList->get_Count(&lCount);
ListView_SetItemCount(hwndLView, lCount);
ltoa(lCount, num, 10);
SendMessage(hwndNFound, WM_SETTEXT, 0, (LPARAM)num);
VariantInit(&vIdx);
V_VT(&vIdx) = VT_I4;
for(int i=0; i<lCount; i++) {
V_I4(&vIdx) = i + 1;
pIGWMessageList->Item(vIdx, &pDIGWMessage);
if(pDIGWMessage && SUCCEEDED(pDIGWMessage->QueryInterface(IID_IGWMessage, (void**)&pIGWMessage))) {
pDIGWMessage->Release();
lvItem.mask = LVIF_TEXT;
lvItem.iItem = i;
LONG APIENTRY ResultDlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LONG lParam)
{
switch(message) {
case WM_INITDIALOG: {
HWND hwndResults;
LV_COLUMN col;
hwndResults = GetDlgItem(hwndDlg, IDC_RESULTS);
col.mask = LVCF_TEXT | LVCF_WIDTH;
col.cx = 100;
col.pszText = "View Name";
ListView_InsertColumn(hwndResults, 0, &col);
col.pszText = "From";
ListView_InsertColumn(hwndResults, 1, &col);
col.pszText = "Subject";
ListView_InsertColumn(hwndResults, 2, &col);
col.pszText = "Date";
ListView_InsertColumn(hwndResults, 3, &col);
col.pszText = "Folder";
ListView_InsertColumn(hwndResults, 4, &col);
col.pszText = "Version";
ListView_InsertColumn(hwndResults, 5, &col);
col.pszText = "Document#";
ListView_InsertColumn(hwndResults, 6, &col);
col.pszText = "Library";
ListView_InsertColumn(hwndResults, 7, &col);
break;
}
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDOK:
DestroyWindow(hwndDlg);
hResultDlg = 0;
break;
}
break;
case WM_CLOSE:
DestroyWindow(hwndDlg);
hResultDlg = 0;
break;
}
return(0);
}