BOOL LocalAddPortEx( LPWSTR pName, DWORD Level, LPBYTE pBuffer, LPWSTR pMonitorName ) { LPWSTR pPortName; DWORD Error; WCHAR szLocalMonitor[MAX_PATH+1]; LPPORT_INFO_1 pPortInfo1; LPPORT_INFO_FF pPortInfoFF; LoadString(hInst, IDS_LOCALMONITOR, szLocalMonitor, sizeof(szLocalMonitor)-1); if (IS_NOT_LOCAL_PORT( pMonitorName, szLocalMonitor)) { // If pMonitorName != "Local Port", we have an // invalid Monitor name SetLastError(ERROR_INVALID_PARAMETER); return(FALSE); } switch (Level) { case (DWORD)-1: pPortInfoFF = (LPPORT_INFO_FF)pBuffer; pPortName = pPortInfoFF->pName; break; case 1: pPortInfo1 = (LPPORT_INFO_1)pBuffer; pPortName = pPortInfo1->pName; break; default: SetLastError(ERROR_INVALID_LEVEL); return(FALSE); } if (!pPortName) { SetLastError(ERROR_INVALID_PARAMETER); return(FALSE); } if (PortExists(pName, pPortName, &Error)) { SetLastError(ERROR_INVALID_PARAMETER); return(FALSE); } if (Error != NO_ERROR) { SetLastError(Error); return(FALSE); } if (!CreatePortEntry(pPortName)) { return(FALSE); } if (!WriteProfileString(szPorts, pPortName, L"")) { DeletePortEntry(pPortName); return(FALSE); } return TRUE; }
BOOL AddPortW( LPWSTR pName, HWND hWnd, LPWSTR pMonitorName ) { WCHAR PortName[MAX_PATH]; DWORD Status; UNREFERENCED_PARAMETER(pName); /* Possible future enhancements: this will be the server name, so that the monitor can update remote servers. */ Status = WNetBrowsePrinterDialog( hWnd, PortName, ( sizeof PortName / sizeof *PortName ), L"Printman.hlp", 0 /* help context */, (PFUNC_VALIDATION_CALLBACK)IsPortValid ); if (Status == NO_ERROR) { EnterSplSem(); if (FindName((PINIENTRY)pIniFirstPort, PortName)) { LeaveSplSem(); Message(hWnd, MSG_ERROR, IDS_ERROR, IDS_PORT_ALREADY_EXISTS_S, PortName); return FALSE; } if( CreatePortEntry( PortName ) ) SetRegistryValue( szRegPortNames, PortName, REG_SZ, L"", 0 ); else ; /* Message box to say can't create port */ LeaveSplSem(); } return TRUE; }
BOOL WINAPI PJLMonOpenPortEx( IN LPTSTR pszPortName, IN LPTSTR pszPrinterName, IN OUT LPHANDLE pHandle, IN OUT LPMONITOR pMonitor ) /*++ Routine Description: Opens the port Arguments: pszPortName : Port name pszPrinterName : Printer name pHandle : Pointer to the handle to return pMonitor : Port monitor function table Return Value: TRUE on success, FALSE on error --*/ { PINIPORT pIniPort; BOOL bRet = FALSE; BOOL bInSem = FALSE; // // Validate port monitor // if ( !pMonitor || !pMonitor->pfnOpenPort || !pMonitor->pfnStartDocPort || !pMonitor->pfnWritePort || !pMonitor->pfnReadPort || !pMonitor->pfnClosePort ) { DBGMSG(DBG_WARNING, ("PjlMon: Invalid port monitors passed to OpenPortEx\n")); SetLastError(ERROR_INVALID_PRINT_MONITOR); goto Cleanup; } EnterSplSem(); bInSem = TRUE; // // Is the port open already? // if ( pIniPort = FindIniPort(pszPortName) ) { SetLastError(ERROR_BUSY); goto Cleanup; } pIniPort = CreatePortEntry(pszPortName); LeaveSplSem(); bInSem = FALSE; if ( pIniPort && (*pMonitor->pfnOpenPort)(pszPortName, &pIniPort->hPort) ) { *pHandle = pIniPort; CopyMemory((LPBYTE)&pIniPort->fn, (LPBYTE)pMonitor, sizeof(*pMonitor)); if ( IsPJL(pIniPort) ) { pIniPort->status |= PP_IS_PJL; CreateUstatusThread(pIniPort); } bRet = TRUE; } else { DBGMSG(DBG_WARNING, ("PjlMon: OpenPort %s : Failed\n", pszPortName)); } Cleanup: if ( bInSem ) { LeaveSplSem(); } SplOutSem(); return bRet; }