Ejemplo n.º 1
0
//////////////////////////////////////////////////////////////////////////
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BOOL SBBSExec::OnCreateVM(VMHANDLE hVM)
{
	DBTRACExd(0,"CreateVM, handle, time",hVM,Get_System_Time());
	DBTRACEx(0,"Current Thread Handle",Get_Cur_Thread_Handle());

	if(start.event) {
		new_vm=find_vm(NULL);
		if(new_vm==NULL) {
			DBTRACE(0,"!NO AVAILABLE VM structures");
			return(FALSE);
		}
		new_vm->handle=hVM;
		new_vm->mode=start.mode;
		new_vm->online = true;
		new_vm->overrun = false;
		new_vm->input_sem = NULL;
		new_vm->output_sem = NULL;

		if(RingBufInit(&new_vm->in, RINGBUF_SIZE_IN)!=0
			|| RingBufInit(&new_vm->out, RINGBUF_SIZE_OUT)!=0) {
			DBTRACE(0,"!FAILED to create I/O buffers");
			return(FALSE);
		}
		if(!VWIN32_SetWin32Event(start.event)) {
			DBTRACEx(0,"!FAILED TO SET EVENT handle", start.event);
			return(FALSE);
		}
		if(!VWIN32_CloseVxDHandle(start.event)) {
			DBTRACEx(0,"!FAILED TO CLOSE EVENT handle", start.event);
			return(FALSE);
		}
		start.event=0;
	}
	return(TRUE);
}
Ejemplo n.º 2
0
DWORD SBBSExec::OnW32DeviceIoControl(PIOCTLPARAMS pIOCTL)
{
	DWORD	rd;
	DWORD	wr;
	DWORD	avail;
	vm_t*	vm;

//	DBTRACEd(0,"SBBSEXEC ioctl"
		//,pIOCTL->dioc_IOCtlCode);

	switch(pIOCTL->dioc_IOCtlCode) {
		case DIOC_OPEN:
			DBTRACEd(0,"IOCTL: OPEN",Get_System_Time());
			break;

		case DIOC_CLOSEHANDLE:
			DBTRACEd(0,"IOCTL: CLOSE",Get_System_Time());
			break;

		case SBBSEXEC_IOCTL_START:
			DBTRACEd(0,"IOCTL: START",Get_System_Time());
			DBTRACEx(0,"Current Thread Handle",Get_Cur_Thread_Handle());
			if(start.event) {
				DBTRACE(0,"Exec already started!");
				return(SBBSEXEC_ERROR_INUSE);
			}
			if (pIOCTL->dioc_InBuf==NULL 
				|| pIOCTL->dioc_cbInBuf!=sizeof(start)) {
				return(SBBSEXEC_ERROR_INBUF);
			}
			start=*(sbbsexec_start_t*)pIOCTL->dioc_InBuf;
			break;

		case SBBSEXEC_IOCTL_COMPLETE:
			DBTRACEd(0,"IOCTL: COMPLETE",Get_System_Time());
			if(start.event || new_vm==NULL) {
				DBTRACE(0,"!VM never created");
				start.event=0;
				return(SBBSEXEC_ERROR_INUSE);
			}
			if(pIOCTL->dioc_OutBuf==NULL
				|| pIOCTL->dioc_cbOutBuf<sizeof(VMHANDLE)) {
				DBTRACE(0,"!Invalid OUTBUF");
				return(SBBSEXEC_ERROR_OUTBUF);
			}
			*(VMHANDLE*)pIOCTL->dioc_OutBuf=new_vm->handle;
			DBTRACEx(0,"CREATED VM HANDLE", new_vm->handle);
			new_vm=NULL;

			if(pIOCTL->dioc_bytesret!=NULL)
				*pIOCTL->dioc_bytesret = sizeof(VMHANDLE);
			break;
		case SBBSEXEC_IOCTL_READ:

			if (pIOCTL->dioc_InBuf==NULL
				|| pIOCTL->dioc_cbInBuf!=sizeof(VMHANDLE)) {
				DBTRACE(0,"!INVALID INBUF");
				return(SBBSEXEC_ERROR_INBUF);
			}

			if (pIOCTL->dioc_OutBuf==NULL || pIOCTL->dioc_cbOutBuf==0) {
				DBTRACE(0,"!INVALID OUTBUF");
				return(SBBSEXEC_ERROR_OUTBUF);
			}

			vm = find_vm(*(VMHANDLE*)pIOCTL->dioc_InBuf);
			if(vm==NULL) {
				DBTRACE(0,"!NO VM LIST");
				return(SBBSEXEC_ERROR_INDATA);
			}

			rd = RingBufFull(&vm->out);

			if(rd>pIOCTL->dioc_cbOutBuf) {
				DBTRACEdd(0,"Reducing read size"
                	,rd, pIOCTL->dioc_cbOutBuf);
				rd=pIOCTL->dioc_cbOutBuf;
			}

			RingBufRead(&vm->out, (BYTE*)pIOCTL->dioc_OutBuf, rd);

			if(pIOCTL->dioc_bytesret!=NULL)
				*pIOCTL->dioc_bytesret = rd;

            if(vm->output_sem!=NULL) // Wake up int14 handler
            	Signal_Semaphore(vm->output_sem);

            if(rd>1) {
            	DBTRACEd(1,"IOCTL_READ bytes", rd);
            }
			break;

		case SBBSEXEC_IOCTL_WRITE:

			if (pIOCTL->dioc_InBuf==NULL
				|| pIOCTL->dioc_cbInBuf<sizeof(VMHANDLE)+1) {
				DBTRACE(0,"!INVALID INBUF");
				return(SBBSEXEC_ERROR_INBUF);
			}

			if (pIOCTL->dioc_OutBuf==NULL
				|| pIOCTL->dioc_cbOutBuf!=sizeof(DWORD)) {
				DBTRACE(0,"!INVALID OUTBUF");
				return(SBBSEXEC_ERROR_OUTBUF);
			}

			vm = find_vm(*(VMHANDLE*)pIOCTL->dioc_InBuf);
			if(vm==NULL) {
				DBTRACE(0,"!NO VM LIST");
				return(SBBSEXEC_ERROR_INDATA);
			}

			wr = pIOCTL->dioc_cbInBuf-sizeof(VMHANDLE);

			avail = RingBufFree(&vm->in);

			if(wr>avail) {
				DBTRACEdd(0,"Reducing write size", wr, avail);
				wr=avail;
			}

			RingBufWrite(&vm->in, (BYTE*)pIOCTL->dioc_InBuf+sizeof(VMHANDLE), wr);

			*(DWORD *)pIOCTL->dioc_OutBuf = wr;

			if(pIOCTL->dioc_bytesret!=NULL)
				*pIOCTL->dioc_bytesret = sizeof(DWORD);

            if(vm->input_sem!=NULL) // Wake up int14 handler
            	Signal_Semaphore(vm->input_sem);

			// Wake up the VDM (improves keyboard response - dramatically!)
			Wake_Up_VM(vm->handle);
			break;

		case SBBSEXEC_IOCTL_DISCONNECT:
			DBTRACEd(0,"IOCTL: DISCONNECT",Get_System_Time());

			if (pIOCTL->dioc_InBuf==NULL
				|| pIOCTL->dioc_cbInBuf!=sizeof(VMHANDLE)) {
				DBTRACE(0,"!INVALID INBUF");
				return(SBBSEXEC_ERROR_INBUF);
			}

			vm = find_vm(*(VMHANDLE*)pIOCTL->dioc_InBuf);
			if(vm==NULL) {
				DBTRACE(0,"!NO VM LIST");
				return(SBBSEXEC_ERROR_INDATA);
			}

			vm->online=false;

            if(vm->input_sem!=NULL) // Wake up int14 handler
            	Signal_Semaphore(vm->input_sem);
            if(vm->output_sem!=NULL) // Wake up int14 handler
            	Signal_Semaphore(vm->output_sem);
			break;

		case SBBSEXEC_IOCTL_STOP:
			DBTRACEd(0,"IOCTL: STOP",Get_System_Time());

			if (pIOCTL->dioc_InBuf==NULL
				|| pIOCTL->dioc_cbInBuf!=sizeof(VMHANDLE)) {
				DBTRACE(0,"!INVALID INBUF");
				return(SBBSEXEC_ERROR_INBUF);
			}

			vm = find_vm(*(VMHANDLE*)pIOCTL->dioc_InBuf);
			if(vm==NULL) {
				DBTRACE(0,"!NO VM LIST");
				return(SBBSEXEC_ERROR_INDATA);
			}

			DBTRACEx(0,"CLOSING VM HANDLE", vm->handle);
			vm->handle=NULL;	// Mark as available
			RingBufDispose(&vm->in);
			RingBufDispose(&vm->out);
            if(vm->input_sem!=NULL) // Wake up int14 handler
            	Signal_Semaphore(vm->input_sem);
            if(vm->output_sem!=NULL) // Wake up int14 handler
            	Signal_Semaphore(vm->output_sem);

			vm->input_sem=NULL;
			vm->output_sem=NULL;

			break;

		default:
			DBTRACEdx(0,"!UNKNOWN IOCTL"
				,pIOCTL->dioc_IOCtlCode,pIOCTL->dioc_IOCtlCode);
			return(SBBSEXEC_ERROR_IOCTL);

	}
	return (0);	// DEVIOCTL_NOERROR);
}
Ejemplo n.º 3
0
void Form_DateSet_Proc(LPWindow pWindow, LPGuiMsgInfo pGuiMsgInfo)
{
	CControl* pControl;	
	GuiMsgInfo guiMsgInfo;
//	static CSysTime time;
	static CSysTime time = {0};
	static CSysTime *SetDate = NULL;

	switch(pGuiMsgInfo->ID)
	{
		case WM_LOAD:
			ClearScreen();
			SysTimeDly(15);
//    		GetSysTime(&time);
		SetDate = Get_System_Time();
			time.year = SetDate->year;
			time.mon	=	SetDate->mon;
			time.day	= SetDate->day;
			time.week	= SetDate->week;
			time.hour	= SetDate->hour;
			time.min	= SetDate->min;
			time.sec	=	SetDate->sec;
			//CreateWindowTimerEx(pWindow, 1);
			//StartWindowTimer(pWindow);		//Æô¶¯Ö÷´°Ì嶨ʱÆ÷
		case WM_SHOW:
    		sprintf(year, "%02d", time.year);		
    		sprintf(month, "%02d", time.mon);		
    		sprintf(day, "%02d", time.day);		
			pWindow->DrawFunc(pWindow);
			break;

		case WM_UPDATECTRL:
			pControl = (CControl*)(pGuiMsgInfo->wParam);
			if(pControl != NULL)
			{
				pControl->DrawFunc(pControl);
			}
			break;

		case WM_TIMEUPDATE:
			PostWindowMsg(pWindow, WM_UPDATECTRL, (uint32)&gStatusBar, 0);
			break;

		case WM_KEYDOWN:
			switch(pGuiMsgInfo->wParam)
			{
				case KEY_UP:
                    if(mDateYY.state & CTRL_FOCUS) {
                        time.year++;
											if (time.year > YEARMAX) {
                            time.year = YEARMIN;
                        }
                        if((time.mon == 2)&&(time.day > 28)) {
                            if (time.day > 29) {
                                time.day = 29;
                            }else if(time.year % 100) {
                                if(time.year % 4) {
                                    time.day=28;//·ÇÈòÄê
                                }
                            } else if(time.year % 400){
                                time.day=28;//·ÇÈòÄê
                            }
                        }
                    } else if(mDateMM.state & CTRL_FOCUS) {
                        time.mon++;
                        if (time.mon > 12) {
                            time.mon = 1;
                        }
                        switch(time.mon) {
                        case 2:
                            if(time.day > 28) {
                                if (time.day > 29) {
                                    time.day = 29;
                                }else if(time.year % 100) {
                                    if(time.year % 4) {
                                        time.day=28;//·ÇÈòÄê
                                    }
                                } else if(time.year % 400){
                                    time.day=28;//·ÇÈòÄê
                                }
                            }
                            break;
                            
                        case 4:
                        case 6:
                        case 9:
                        case 11:
                            if(time.day > 30) {
                                time.day = 30;
                            }
                            break;

                        default :
                            break;
                        }
                    } else if(mDateDD.state & CTRL_FOCUS) {
                        time.day++;
                        switch(time.mon) {
                        case 2:
                            if(time.day > 28) {
                                if (time.day > 29) {
                                    time.day = 1;
                                }else if(time.year % 100) {
                                    if(time.year % 4) {
                                        time.day=1;//·ÇÈòÄê
                                    }
                                } else if(time.year % 400){
                                    time.day=1;//·ÇÈòÄê
                                }
                            }
                            break;
                            
                        case 4:
                        case 6:
                        case 9:
                        case 11:
                            if(time.day > 30) {
                                time.day = 1;
                            }
                            break;

                        default :
                            if (time.day > 31) {
                                time.day = 1;
                            }
                            break;
                        }
                    }
					guiMsgInfo.pWindow = pWindow;
					guiMsgInfo.ID = WM_SHOW;
					GuiMsgQueuePost(&guiMsgInfo);					
					break;
				case KEY_DOWN:
                    if(mDateYY.state & CTRL_FOCUS) {
                        if (time.year > YEARMIN) {
                            time.year--;
                        } else {
                            time.year = YEARMAX;
                        }
                        if((time.mon == 2)&&(time.day > 28)) {
                            if (time.day > 29) {
                                time.day = 29;
                            }else if(time.year % 100) {
                                if(time.year % 4) {
                                    time.day=28;//·ÇÈòÄê
                                }
                            } else if(time.year % 400){
                                time.day=28;//·ÇÈòÄê
                            }
                        }
                    } else if(mDateMM.state & CTRL_FOCUS) {
                        if (time.mon > 1) {
                            time.mon--;
                        } else {
                            time.mon = 12;
                        }
                        switch(time.mon) {
                        case 2:
                            if(time.day > 28) {
                                if (time.day > 29) {
                                    time.day = 29;
                                }else if(time.year % 100) {
                                    if(time.year % 4) {
                                        time.day=28;//·ÇÈòÄê
                                    }
                                } else if(time.year % 400){
                                    time.day=28;//·ÇÈòÄê
                                }
                            }
                            break;
                            
                        case 4:
                        case 6:
                        case 9:
                        case 11:
                            if(time.day > 30) {
                                time.day = 30;
                            }
                            break;

                        default :
                            break;
                        }
                    } else if(mDateDD.state & CTRL_FOCUS) {
                        if (time.day > 1) {
                            time.day--;
                        } else {
                            time.day = 31;
                        }
                        switch(time.mon) {
                        case 2:
                            if(time.day > 28) {
                                time.day=28;
                                if(time.year % 100) {
                                    if(!(time.year % 4)) {
                                        time.day=29;//ÈòÄê
                                    }
                                } else if(!(time.year % 400)){
                                    time.day=29;//ÈòÄê
                                }
                            }
                            break;
                            
                        case 4:
                        case 6:
                        case 9:
                        case 11:
                            if(time.day > 30) {
                                time.day = 30;
                            }
                            break;

                        default :
                            break;
                        }
                    }
					guiMsgInfo.pWindow = pWindow;
					guiMsgInfo.ID = WM_SHOW;
					GuiMsgQueuePost(&guiMsgInfo);					
					break;

				case KEY_LEFT:
                    if(mDateDD.state & CTRL_FOCUS) {
                        mDateDD.state &=~CTRL_FOCUS;
                        mDateMM.state |= CTRL_FOCUS;
                    }else if(mDateMM.state & CTRL_FOCUS) {
                        mDateMM.state &=~CTRL_FOCUS;
                        mDateYY.state |= CTRL_FOCUS;
                    }
					guiMsgInfo.pWindow = pWindow;
					guiMsgInfo.ID = WM_SHOW;
					GuiMsgQueuePost(&guiMsgInfo);					
					break;

				case KEY_OK:
//            SetSysDate(time.Year, time.Month, time.Day);
				      Set_System_Time(&time);
        			SysTimeDly(100);
					if(pWindow->pParentWindow != NULL)
					{
						g_pCurWindow = pWindow->pParentWindow;
					}
					else
					{
						g_pCurWindow = &gWD_Main;
					}
					guiMsgInfo.pWindow = g_pCurWindow;
					guiMsgInfo.ID = WM_LOAD;
					GuiMsgQueuePost(&guiMsgInfo);					
					break;

				case KEY_RIGHT: 
                    if(mDateYY.state & CTRL_FOCUS) {
                        mDateYY.state &=~CTRL_FOCUS;
                        mDateMM.state |= CTRL_FOCUS;
                    } else if(mDateMM.state & CTRL_FOCUS) {
                        mDateMM.state &=~CTRL_FOCUS;
                        mDateDD.state |= CTRL_FOCUS;
                    }
					guiMsgInfo.pWindow = pWindow;
					guiMsgInfo.ID = WM_SHOW;
					GuiMsgQueuePost(&guiMsgInfo);					
					break;

				case KEY_BACK:
					if(pWindow->pParentWindow != NULL)
					{
						g_pCurWindow = pWindow->pParentWindow;
					}
					else
					{
						g_pCurWindow = &gWD_Main;
					}
                    PostWindowMsg(g_pCurWindow, WM_LOAD,0,0);
					break;

				default:
					break;
			}
			break;
		
		default:
			break;
	}	
}