|
|
1.1 root 1: /* QuickCase:W KNB Version 1.00 */
2: #include "MAPIAPP.h"
3: #include <string.h>
4: #include <stdio.h>
5: #include "mapi.h"
6: #define MAIN 1
7: #include "mapinit.h"
8:
9:
10: HANDLE hLibrary;
11: LHANDLE hMAPISession;
12:
13: MapiMessage mmMapiMessage;
14:
15: ULONG nMessageSize = 0x000004000;
16: lpMapiMessage FAR *lppMessage;
17: lpMapiMessage lpMessage;
18: char szSeedMessageID[512];
19: char szMessageID[512];
20: char szSubject[512];
21: char szNoteText[4096];
22:
23: LPSTR lpszSeedMessageID = &szSeedMessageID[0];
24: LPSTR lpszMessageID = &szMessageID[0];
25:
26: LPSTR pszSubject = &szSubject[0];
27: LPSTR pszNoteText = &szNoteText[0];
28: LPSTR pszDateReceived = "1991/03/23 12:00";
29: MapiRecipDesc rdOriginator = { 0L,MAPI_ORIG,(LPSTR)"ONE",NULL};
30:
31: int iFindFirst= TRUE;
32:
33: void InitMessage(lpMapiMessage pmmMessage)
34: {
35: pmmMessage->ulReserved = 0L;
36: pmmMessage->lpszSubject =pszSubject;
37: pmmMessage->lpszNoteText =pszNoteText;
38: pmmMessage->lpszMessageType = NULL;
39: pmmMessage->lpszDateReceived = pszDateReceived;
40: pmmMessage->flFlags = MAPI_UNREAD;
41: pmmMessage->lpOriginator = &rdOriginator;
42: pmmMessage->nRecipCount = 0L;
43: pmmMessage->lpRecips = NULL;
44: pmmMessage->nFileCount = 0L;
45: pmmMessage->lpFiles = NULL;
46: }
47:
48: /****************************************************************************
49:
50: FUNCTION: OutOfMemory(void)
51:
52: PURPOSE: Displays warning message
53:
54: ****************************************************************************/
55: void OutOfMemory(void)
56: {
57: MessageBox(
58: GetFocus(),
59: "Out of Memory",
60: NULL,
61: MB_ICONHAND | MB_SYSTEMMODAL);
62: return;
63: }
64:
65: void mycpystr(char * npszStrg, LPSTR lpszStrg)
66: {
67: if (lpszStrg != NULL)
68: strcpy(npszStrg, lpszStrg);
69: else
70: *npszStrg = '\0';
71: }
72:
73:
74: /************************************************************************/
75: /* */
76: /* Windows 3.0 Main Program Body */
77: /* */
78: /* The following routine is the Windows Main Program. The Main Program */
79: /* is executed when a program is selected from the Windows Control */
80: /* Panel or File Manager. The WinMain routine registers and creates */
81: /* the program's main window and initializes global objects. The */
82: /* WinMain routine also includes the applications message dispatch */
83: /* loop. Every window message destined for the main window or any */
84: /* subordinate windows is obtained, possibly translated, and */
85: /* dispatched to a window or dialog processing function. The dispatch */
86: /* loop is exited when a WM_QUIT message is obtained. Before exiting */
87: /* the WinMain routine should destroy any objects created and free */
88: /* memory and other resources. */
89: /* */
90: /************************************************************************/
91:
92: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
93: {
94: /***********************************************************************/
95: /* HANDLE hInstance; handle for this instance */
96: /* HANDLE hPrevInstance; handle for possible previous instances */
97: /* LPSTR lpszCmdLine; long pointer to exec command line */
98: /* int nCmdShow; Show code for main window display */
99: /***********************************************************************/
100:
101: MSG msg; /* MSG structure to store your messages */
102: int nRc; /* return value from Register Classes */
103: long nWndunits; /* window units for size and location */
104: int nWndx; /* the x axis multiplier */
105: int nWndy; /* the y axis multiplier */
106: int nX; /* the resulting starting point (x, y) */
107: int nY;
108: int nWidth; /* the resulting width and height for this */
109: int nHeight; /* window */
110:
111: strcpy(szAppName, "MAPIAPP");
112: hInst = hInstance;
113: if(!hPrevInstance)
114: {
115: /* register window classes if first instance of application */
116: if ((nRc = nCwRegisterClasses()) == -1)
117: {
118: /* registering one of the windows failed */
119: LoadString(hInst, IDS_ERR_REGISTER_CLASS, szString, sizeof(szString));
120: MessageBox(NULL, szString, NULL, MB_ICONEXCLAMATION);
121: return nRc;
122: }
123: }
124:
125: /* Create a device independant size and location */
126: nWndunits = GetDialogBaseUnits();
127: nWndx = LOWORD(nWndunits);
128: nWndy = HIWORD(nWndunits);
129: nX = ((60 * nWndx) / 4);
130: nY = ((60 * nWndy) / 8);
131: nWidth = ((197 * nWndx) / 4);
132: nHeight = ((138 * nWndy) / 8);
133:
134: /* create application's Main window */
135: hWndMain = CreateWindow(
136: szAppName, /* Window class name */
137: "MAPI Sample App", /* Window's title */
138: WS_CAPTION | /* Title and Min/Max */
139: WS_SYSMENU | /* Add system menu box */
140: WS_MINIMIZEBOX | /* Add minimize box */
141: WS_MAXIMIZEBOX | /* Add maximize box */
142: WS_BORDER | /* thin frame */
143: WS_CLIPCHILDREN | /* don't draw in child windows areas */
144: WS_OVERLAPPED,
145: nX, nY, /* X, Y */
146: nWidth, nHeight, /* Width, Height of window */
147: NULL, /* Parent window's handle */
148: NULL, /* Default to Class Menu */
149: hInst, /* Instance of window */
150: NULL); /* Create struct for WM_CREATE */
151:
152:
153: if (InitMAPI() != 0)
154: return ERR_LOAD_LIB;
155:
156: InitMessage(&mmMapiMessage);
157:
158: if(hWndMain == NULL)
159: {
160: LoadString(hInst, IDS_ERR_CREATE_WINDOW, szString, sizeof(szString));
161: MessageBox(NULL, szString, NULL, MB_ICONEXCLAMATION);
162: return IDS_ERR_CREATE_WINDOW;
163: }
164:
165: EnableMenuItem(GetMenu(hWndMain), IDM_A_LOGOFF, MF_DISABLED | MF_GRAYED);
166: EnableMenuItem(GetMenu(hWndMain), IDM_S_MAIL, MF_DISABLED | MF_GRAYED);
167: EnableMenuItem(GetMenu(hWndMain), IDM_S_DOCUMENT, MF_DISABLED | MF_GRAYED);
168: EnableMenuItem(GetMenu(hWndMain), IDM_M_FINDFIRST, MF_DISABLED | MF_GRAYED);
169: EnableMenuItem(GetMenu(hWndMain), IDM_M_FINDNEXT, MF_DISABLED | MF_GRAYED);
170: EnableMenuItem(GetMenu(hWndMain), IDM_M_READ, MF_DISABLED | MF_GRAYED);
171: EnableMenuItem(GetMenu(hWndMain), IDM_M_DELETE, MF_DISABLED | MF_GRAYED);
172:
173: ShowWindow(hWndMain, nCmdShow); /* display main window */
174:
175: while(GetMessage(&msg, NULL, 0, 0)) /* Until WM_QUIT message */
176: {
177: TranslateMessage(&msg);
178: DispatchMessage(&msg);
179: }
180:
181: DeInitMAPI();
182: /* Do clean up before exiting from the application */
183: CwUnRegisterClasses();
184: return msg.wParam;
185: } /* End of WinMain */
186: /************************************************************************/
187: /* */
188: /* Main Window Procedure */
189: /* */
190: /* This procedure provides service routines for the Windows events */
191: /* (messages) that Windows sends to the window, as well as the user */
192: /* initiated events (messages) that are generated when the user selects */
193: /* the action bar and pulldown menu controls or the corresponding */
194: /* keyboard accelerators. */
195: /* */
196: /* The SWITCH statement shown below distributes the window messages to */
197: /* the respective message service routines, which are set apart by the */
198: /* CASE statements. The window procedures must provide an appropriate */
199: /* service routine for its end user initiated messages, as well as the */
200: /* general Windows messages (ie. WM_CLOSE message). If a message is */
201: /* sent to this procedure for which there is no programmed CASE clause */
202: /* (i.e., no service routine), the message is defaulted to the */
203: /* DefWindowProc function, where it is handled by Windows */
204: /* */
205: /* For the end-user initiated messages, this procedure is concerned */
206: /* principally with the WM_COMMAND message. The menu control ID (or the */
207: /* corresponding accelerator ID) is communicated to this procedure in */
208: /* the first message parameter (wParam). The window procedure provides */
209: /* a major CASE statement for the WM_COMMAND message and a subordinate */
210: /* SWITCH statement to provide CASE clauses for the message service */
211: /* routines for the various menu item's, identified by their ID values. */
212: /* */
213: /* The message service routines for the individual menu items are the */
214: /* main work points in the program. These service routines contain the */
215: /* units of work performed when the end user select one of the menu */
216: /* controls. The required application response to a menu control is */
217: /* programmed in its associated CASE clause. The service routines may */
218: /* contain subroutine calls to separately compiled and libraried */
219: /* routines, in-line calls to subroutines to be embodied in this source */
220: /* code module, or program statements entered directly in the CASE */
221: /* clauses. Program control is switched to the appropriate service */
222: /* routine when Windows recognizes the end user event and sends a WM_COMMAND */
223: /* message to the window procedure. The service routine provides the */
224: /* appropriate application-specific response to the end user initiated */
225: /* event, then breaks to return control to the WinMain() routine which */
226: /* continues to service the message queue of the window(s). */
227: /* */
228: /************************************************************************/
229:
230: LONG FAR PASCAL WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
231: {
232: HMENU hMenu=0; /* handle for the menu */
233: HBITMAP hBitmap=0; /* handle for bitmaps */
234: HDC hDC; /* handle for the display device */
235: PAINTSTRUCT ps; /* holds PAINT information */
236: int nRc=0; /* return code */
237: FLAGS flFlag = 0L;
238: ULONG ulResult;
239: char szBuf[32*1024]; // Waste of stack space, but this is only a demo.
240: char szTmp[32*1024]; // Waste of stack space, but this is only a demo.
241:
242: switch (Message) {
243: case WM_COMMAND:
244: /* The Windows messages for action bar and pulldown menu items */
245: /* are processed here. */
246: /* The WM_COMMAND message contains the message ID in its first */
247: /* parameter (wParam). This routine is programmed to SWITCH on */
248: /* the #define values generated by CASE:W for the menu items */
249: /* in the application's header (*.H) file. The ID values have */
250: /* the format, IDM_itemname. The service routines for the */
251: /* various menu items follow the CASE statements up to the */
252: /* generated BREAK statements. */
253: switch (LOWORD(wParam)) {
254: case IDM_A_LOGON:
255: /* Place User Code to respond to the */
256: /* Menu Item Named "Log&In" here. */
257: flFlag =MAPI_NEW_SESSION | MAPI_LOGON_UI;
258: ulResult = (*lpfnMAPILogon)(hWnd, NULL, NULL, flFlag, 0L, (LPLHANDLE)&hMAPISession);
259: if (ulResult == 0L) {
260: EnableMenuItem(GetMenu(hWndMain), IDM_A_LOGOFF, MF_ENABLED);
261: EnableMenuItem(GetMenu(hWndMain), IDM_S_MAIL, MF_ENABLED);
262: EnableMenuItem(GetMenu(hWndMain), IDM_S_DOCUMENT, MF_ENABLED);
263: EnableMenuItem(GetMenu(hWndMain), IDM_M_FINDFIRST, MF_ENABLED);
264: EnableMenuItem(GetMenu(hWndMain), IDM_M_FINDNEXT, MF_ENABLED);
265: }
266: break;
267:
268: case IDM_A_LOGOFF:
269: /* Place User Code to respond to the */
270: /* Menu Item Named "Log&Off" here. */
271: ulResult = (*lpfnMAPILogoff)(hMAPISession, hWnd, 0L, 0L);
272: if (ulResult == 0L) {
273: EnableMenuItem(GetMenu(hWndMain), IDM_A_LOGOFF, MF_DISABLED | MF_GRAYED);
274: EnableMenuItem(GetMenu(hWndMain), IDM_S_MAIL, MF_DISABLED | MF_GRAYED);
275: EnableMenuItem(GetMenu(hWndMain), IDM_S_DOCUMENT, MF_DISABLED | MF_GRAYED);
276: EnableMenuItem(GetMenu(hWndMain), IDM_M_FINDFIRST, MF_DISABLED | MF_GRAYED);
277: EnableMenuItem(GetMenu(hWndMain), IDM_M_FINDNEXT, MF_DISABLED | MF_GRAYED);
278: EnableMenuItem(GetMenu(hWndMain), IDM_M_READ, MF_DISABLED | MF_GRAYED);
279: EnableMenuItem(GetMenu(hWndMain), IDM_M_DELETE, MF_DISABLED | MF_GRAYED);
280: }
281: break;
282:
283: case IDM_S_MAIL:
284: /* Place User Code to respond to the */
285: /* Menu Item Named "&Mail" here. */
286: flFlag =MAPI_DIALOG;
287: ulResult = (*lpfnMAPISendMail)(hMAPISession, hWnd, &mmMapiMessage, flFlag, 0L);
288: break;
289:
290: case IDM_S_DOCUMENT:
291: /* Place User Code to respond to the */
292: /* Menu Item Named "&Document" here. */
293: ulResult = (*lpfnMAPISendDocuments)(hWnd, ";", "C:\\CONFIG.SYS", "CONFIG.SYS", 0L);
294: break;
295:
296: case IDM_M_FINDFIRST:
297: iFindFirst=TRUE;
298: case IDM_M_FINDNEXT:
299: /* Place User Code to respond to the */
300: /* Menu Item Named "&Find Next" here. */
301: if (iFindFirst) {
302: *lpszSeedMessageID = '\0';
303: iFindFirst = FALSE;
304: }
305: else {
306: strcpy(lpszSeedMessageID,lpszMessageID);
307: }
308: ulResult = (*lpfnMAPIFindNext)(hMAPISession, hWnd, NULL, lpszSeedMessageID, flFlag, 0L, lpszMessageID);
309: if (ulResult == 0L) {
310: EnableMenuItem(GetMenu(hWndMain), IDM_M_FINDNEXT, MF_ENABLED);
311: EnableMenuItem(GetMenu(hWndMain), IDM_M_READ, MF_ENABLED);
312: EnableMenuItem(GetMenu(hWndMain), IDM_M_DELETE, MF_ENABLED);
313: }
314: else {
315: EnableMenuItem(GetMenu(hWndMain), IDM_M_FINDNEXT, MF_DISABLED | MF_GRAYED);
316: EnableMenuItem(GetMenu(hWndMain), IDM_M_READ, MF_DISABLED | MF_GRAYED);
317: EnableMenuItem(GetMenu(hWndMain), IDM_M_DELETE, MF_DISABLED | MF_GRAYED);
318: }
319: break;
320:
321: case IDM_M_READ:
322: /* Place User Code to respond to the */
323: /* Menu Item Named "&Read" here. */
324:
325: lppMessage= (lpMapiMessage FAR *) &lpMessage;
326: ulResult = (*lpfnMAPIReadMail)(hMAPISession, hWnd, lpszMessageID, flFlag, 0L, lppMessage);
327: if (ulResult == 0L) {
328: mycpystr(szTmp,lpMessage->lpOriginator->lpszName);
329: sprintf(szBuf,"From: %s\n",szTmp);
330: mycpystr(szTmp,lpMessage->lpRecips[0].lpszName);
331: sprintf(szBuf,"%sTo: %s\n",szBuf,szTmp);
332: mycpystr(szTmp,lpMessage->lpszDateReceived);
333: sprintf(szBuf,"%sDate: %s\n",szBuf,szTmp);
334: mycpystr(szTmp,lpMessage->lpszSubject);
335: sprintf(szBuf,"%sSubject: %s\n\n",szBuf,szTmp);
336: mycpystr(szTmp,lpMessage->lpszNoteText);
337: sprintf(szBuf,"%s%s",szBuf,szTmp);
338:
339: MessageBox(hWnd,szBuf,"Message",MB_OK);
340:
341: ulResult = lpfnMAPIFreeBuffer((LPVOID)lpMessage);
342: }
343: break;
344:
345: case IDM_M_DELETE:
346: /* Place User Code to respond to the */
347: /* Menu Item Named "&Delete" here. */
348:
349: ulResult = (*lpfnMAPIDeleteMail)(hMAPISession, hWnd, lpszMessageID, flFlag, 0l);
350: if (ulResult == 0L) {
351: EnableMenuItem(GetMenu(hWndMain), IDM_M_READ, MF_DISABLED | MF_GRAYED);
352: EnableMenuItem(GetMenu(hWndMain), IDM_M_DELETE, MF_DISABLED | MF_GRAYED);
353: }
354: break;
355:
356: default:
357: return DefWindowProc(hWnd, Message, wParam, lParam);
358: }
359: if (ulResult != 0L) { /** oops **/
360: sprintf(szBuf,"Error Returned = %lu",ulResult);
361: MessageBox(hWnd,szBuf,"FAILED",MB_OK);
362: }
363: else {
364: sprintf(szBuf,"Good Job");
365: MessageBox(hWnd,szBuf,"SUCCESS",MB_OK);
366: }
367: break; /* End of WM_COMMAND */
368:
369: case WM_CREATE:
370: /* The WM_CREATE message is sent once to a window when the */
371: /* window is created. The window procedure for the new window */
372: /* receives this message after the window is created, but */
373: /* before the window becomes visible. */
374: /* */
375: /* Parameters: */
376: /* */
377: /* lParam - Points to a CREATESTRUCT structure with */
378: /* the following form: */
379: /* */
380: /* typedef struct */
381: /* { */
382: /* LPSTR lpCreateParams; */
383: /* HANDLE hInst; */
384: /* HANDLE hMenu; */
385: /* HWND hwndParent; */
386: /* int cy; */
387: /* int cx; */
388: /* int y; */
389: /* int x; */
390: /* LONG style; */
391: /* LPSTR lpszName; */
392: /* LPSTR lpszClass; */
393: /* DWORD dwExStyle; */
394: /* } CREATESTRUCT; */
395:
396:
397:
398: break; /* End of WM_CREATE */
399:
400: case WM_MOVE: /* code for moving the window */
401: break;
402:
403: case WM_SIZE: /* code for sizing client area */
404: /* wParam contains a code indicating the requested sizing */
405: /* lParam contains the new height and width of the client area */
406: break; /* End of WM_SIZE */
407:
408: case WM_PAINT: /* code for the window's client area */
409: /* Obtain a handle to the device context */
410: /* BeginPaint will sends WM_ERASEBKGND if appropriate */
411: memset(&ps, 0x00, sizeof(PAINTSTRUCT));
412: hDC = BeginPaint(hWnd, &ps);
413:
414: /* Included in case the background is not a pure color */
415: SetBkMode(hDC, TRANSPARENT);
416:
417: /* Application should draw on the client window using */
418: /* the GDI graphics and text functions. 'ps' the PAINTSTRUCT */
419: /* returned by BeginPaint contains a rectangle to the */
420: /* area that must be repainted. */
421:
422: /* Inform Windows painting is complete */
423: EndPaint(hWnd, &ps);
424: break; /* End of WM_PAINT */
425:
426: case WM_CLOSE: /* close the window */
427: /* Destroy child windows, modeless dialogs, then, this window */
428: DestroyWindow(hWnd);
429: if (hWnd == hWndMain)
430: PostQuitMessage(0); /* Quit the application */
431: break;
432:
433: default:
434: /* For any message for which you don't specifically provide a */
435: /* service routine, you should return the message to Windows */
436: /* for default message processing. */
437: return DefWindowProc(hWnd, Message, wParam, lParam);
438: }
439: return 0L;
440: } /* End of WndProc */
441:
442: /************************************************************************/
443: /* */
444: /* nCwRegisterClasses Function */
445: /* */
446: /* The following function registers all the classes of all the windows */
447: /* associated with this application. The function returns an error code */
448: /* if unsuccessful, otherwise it returns 0. */
449: /* */
450: /************************************************************************/
451:
452: int nCwRegisterClasses(void)
453: {
454: WNDCLASS wndclass; /* struct to define a window class */
455: memset(&wndclass, 0x00, sizeof(WNDCLASS));
456:
457:
458: /* load WNDCLASS with window's characteristics */
459: wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_BYTEALIGNWINDOW;
460: wndclass.lpfnWndProc = WndProc;
461: /* Extra storage for Class and Window objects */
462: wndclass.cbClsExtra = 0;
463: wndclass.cbWndExtra = 0;
464: wndclass.hInstance = hInst;
465: wndclass.hIcon = LoadIcon(hInst, "MAPIAPP");
466: wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
467: /* Create brush for erasing background */
468: wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
469: wndclass.lpszMenuName = szAppName; /* Menu Name is App Name */
470: wndclass.lpszClassName = szAppName; /* Class Name is App Name */
471: if(!RegisterClass(&wndclass))
472: return -1;
473:
474:
475: return(0);
476: } /* End of nCwRegisterClasses */
477:
478: /************************************************************************/
479: /* CwUnRegisterClasses Function */
480: /* */
481: /* Deletes any refrences to windows resources created for this */
482: /* application, frees memory, deletes instance, handles and does */
483: /* clean up prior to exiting the window */
484: /* */
485: /************************************************************************/
486:
487: void CwUnRegisterClasses(void)
488: {
489: WNDCLASS wndclass; /* struct to define a window class */
490: memset(&wndclass, 0x00, sizeof(WNDCLASS));
491:
492: UnregisterClass(szAppName, hInst);
493: } /* End of CwUnRegisterClasses */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.