/* * Used to get printer device information from a printer name. This * can fail if the user has no right to read printer properties, so * this function can return NULL. */ GtkPrintWin32Devnames * gtk_print_win32_devnames_from_printer_name (const char *printer_name) { HANDLE hprinter; gunichar2* win32_printer_name; GtkPrintWin32Devnames *devnames; win32_printer_name = g_utf8_to_utf16 (printer_name, -1, NULL, NULL, NULL); if (OpenPrinterW (win32_printer_name, &hprinter, NULL)) { DWORD needed; PRINTER_INFO_2W* printer_info; GetPrinterW (hprinter, 2, NULL, 0, &needed); printer_info = (PRINTER_INFO_2W* )g_malloc ((gsize) needed); GetPrinterW (hprinter, 2, (LPBYTE) printer_info, needed, &needed); devnames = g_new (GtkPrintWin32Devnames, 1); devnames->driver = g_utf16_to_utf8 (printer_info->pDriverName, -1, NULL, NULL, NULL); devnames->device = g_strdup (printer_name); devnames->output = g_utf16_to_utf8 (printer_info->pPortName, -1, NULL, NULL, NULL); devnames->flags = 0; ClosePrinter (hprinter); g_free (printer_info); } else { /* Could not open printer */ devnames = NULL; } g_free (win32_printer_name); return devnames; }
void PrintDialog::SetOptions() { #ifdef HAVE_CUPS PrinterOpts = ""; if (!cdia) cdia = new CupsOptions(this, PrintDest->currentText()); if (!cdia->exec()) { delete cdia; // if options was canceled delete dia cdia = 0; // so that getoptions() in the okButtonClicked() will get // the default values from the last succesful run } #elif defined(_WIN32) bool done; Qt::HANDLE handle = NULL; // Retrieve the selected printer QString printerS = PrintDest->currentText(); // Get a printer handle done = OpenPrinterW( (LPWSTR) printerS.utf16(), &handle, NULL ); if(!done) return; // Merge stored settings, prompt user and return user settings DocumentPropertiesW( winId(), handle, (LPWSTR) printerS.utf16(), (DEVMODEW*) DevMode.data(), (DEVMODEW*) DevMode.data(), DM_IN_BUFFER | DM_IN_PROMPT | DM_OUT_BUFFER); // Free the printer handle ClosePrinter( handle ); #endif }
bool PrinterUtil::initDeviceSettings( QString printerName, QByteArray& devModeA ) { bool done; uint size; LONG result = IDOK+1; Qt::HANDLE handle = NULL; // Get the printer handle done = OpenPrinterW( (LPWSTR) printerName.utf16(), &handle, NULL ); if(!done) return false; // Get size of DEVMODE structure (public + private data) size = DocumentPropertiesW( ScCore->primaryMainWindow()->winId(), handle, (LPWSTR) printerName.utf16(), NULL, NULL, 0); // Compare size with DevMode structure size if( devModeA.size() == size ) { // Merge printer settings result = DocumentPropertiesW( ScCore->primaryMainWindow()->winId(), handle, (LPWSTR) printerName.utf16(), (DEVMODEW*) devModeA.data(), (DEVMODEW*) devModeA.data(), DM_IN_BUFFER | DM_OUT_BUFFER); } else { // Retrieve default settings devModeA.resize( size ); result = DocumentPropertiesW( ScCore->primaryMainWindow()->winId(), handle, (LPWSTR) printerName.utf16(), (DEVMODEW*) devModeA.data(), NULL, DM_OUT_BUFFER); } done = ( result == IDOK); // Free the printer handle ClosePrinter( handle ); return done; }
BOOL WINAPI Monitor_EndDocPort(HANDLE port){ if(port==NULL){return false;} JNIEnv* env=NULL; jvm->AttachCurrentThread((void**)&env,NULL); jboolean res=false; const jchar* printername=NULL; jint job=JNU_CallMethodByName(env,NULL,(jobject)port,"getJob","()I").i; jobject jprintername=JNU_CallMethodByName(env,NULL,(jobject)port,"getPrinter","()Ljava/lang/String;").l; if(env->ExceptionCheck()){goto cleanup;} printername=env->GetStringChars((jstring)jprintername,NULL); if(env->ExceptionCheck()){goto cleanup;} HANDLE printer; if(OpenPrinterW((WCHAR*)printername,&printer,NULL)){ // Tell spooler/printer that we are done. SetJob(printer,job,0,NULL,JOB_CONTROL_DELETE); CloseHandle(printer); } res=JNU_CallMethodByName(env,NULL,(jobject)port,"end","()Z").z; cleanup: if(env->ExceptionCheck()){env->ExceptionClear();} if((jprintername!=NULL)&&(printername!=NULL)){env->ReleaseStringChars((jstring)jprintername,printername);} return res; }
bool DeleteShare(UserManager *panel,bool selection) { bool res=false; CFarPanelSelection sp((HANDLE)panel,selection); if(sp.Number()) { TCHAR warning[TINY_BUFFER]; if(sp.Number()==1) { TCHAR Truncated[MAX_PATH]; _tcscpy(Truncated,sp[0].FileName); FSF.TruncPathStr(Truncated,50); FSF.sprintf(warning,GetMsg(mDelOne),Truncated); } else FSF.sprintf(warning,GetMsg(mDelShareN+NumberType(sp.Number())),sp.Number()); const TCHAR *MsgItems[]={GetMsg(mButtonDelete),warning,GetMsg(mButtonDelete),GetMsg(mButtonCancel)}; if(!Info.Message(&MainGuid,&DelShareMessageGuid,0,NULL,MsgItems,sizeof(MsgItems)/sizeof(MsgItems[0]),2)) { res=true; for(int i=0;i<sp.Number();i++) if(panel->level==levelPrinterShared) { HANDLE printer; PRINTER_DEFAULTSW defaults; PRINTER_INFO_2W *data=NULL; memset(&defaults,0,sizeof(defaults)); defaults.DesiredAccess=PRINTER_ALL_ACCESS; if(OpenPrinterW(panel->hostfile,&printer,&defaults)) { DWORD Needed; if(!GetPrinterW(printer,2,NULL,0,&Needed)) { if(GetLastError()==ERROR_INSUFFICIENT_BUFFER) { data=(PRINTER_INFO_2W *)malloc(Needed); if(data) { if(GetPrinterW(printer,2,(PBYTE)data,Needed,&Needed)) { data->Attributes&=~PRINTER_ATTRIBUTE_SHARED; if(SetPrinterW(printer,2,(PBYTE)data,0)) res=true; } free(data); data=NULL; } } } ClosePrinter(printer); } } else if(sp[i].UserData.FreeData) { NetShareDel(panel->computer_ptr,GetWideNameFromUserData(sp[i].UserData.Data),0); } } } return res; }
/************************************************************************ * PSDRV_StartDoc */ INT PSDRV_StartDoc( PHYSDEV dev, const DOCINFOW *doc ) { PSDRV_PDEVICE *physDev = get_psdrv_dev( dev ); DOC_INFO_1W di; PRINTER_DEFAULTSW prn_def; TRACE("(%p, %p) => %s, %s, %s\n", physDev, doc, debugstr_w(doc->lpszDocName), debugstr_w(doc->lpszOutput), debugstr_w(doc->lpszDatatype)); if(physDev->job.id) { FIXME("hJob != 0. Now what?\n"); return 0; } prn_def.pDatatype = NULL; prn_def.pDevMode = &physDev->pi->Devmode->dmPublic; prn_def.DesiredAccess = PRINTER_ACCESS_USE; if (!OpenPrinterW( physDev->pi->friendly_name, &physDev->job.hprinter, &prn_def )) { WARN("OpenPrinter(%s, ...) failed: %d\n", debugstr_w(physDev->pi->friendly_name), GetLastError()); return 0; } di.pDocName = (LPWSTR) doc->lpszDocName; di.pDatatype = NULL; if(doc->lpszOutput) di.pOutputFile = (LPWSTR) doc->lpszOutput; else if(physDev->job.output) di.pOutputFile = physDev->job.output; else di.pOutputFile = NULL; TRACE("using output: %s\n", debugstr_w(di.pOutputFile)); /* redirection located in HKCU\Software\Wine\Printing\Spooler is done during winspool.drv,ScheduleJob */ physDev->job.id = StartDocPrinterW(physDev->job.hprinter, 1, (LPBYTE) &di); if(!physDev->job.id) { WARN("StartDocPrinter() failed: %d\n", GetLastError()); ClosePrinter(physDev->job.hprinter); return 0; } physDev->job.banding = FALSE; physDev->job.OutOfPage = TRUE; physDev->job.PageNo = 0; physDev->job.quiet = FALSE; physDev->job.in_passthrough = FALSE; physDev->job.had_passthrough_rect = FALSE; physDev->job.doc_name = strdupW( doc->lpszDocName ); return physDev->job.id; }
/***************************************************** * open_monitor_by_name [internal] * */ static BOOL open_monitor_by_name(LPCWSTR pPrefix, LPCWSTR pPort, HANDLE * phandle) { PRINTER_DEFAULTSW pd; LPWSTR fullname; BOOL res; * phandle = 0; TRACE("(%s,%s)\n", debugstr_w(pPrefix),debugstr_w(pPort) ); fullname = strdupWW(pPrefix, pPort); pd.pDatatype = NULL; pd.pDevMode = NULL; pd.DesiredAccess = SERVER_ACCESS_ADMINISTER; res = OpenPrinterW(fullname, phandle, &pd); HeapFree(GetProcessHeap(), 0, fullname); return res; }
//------------------------------------------------------------------------------------- BOOL WINAPI MfmWritePort(HANDLE hPort, LPBYTE pBuffer, DWORD cbBuf, LPDWORD pcbWritten) { if (!hPort) { g_pLog->Log(LOGLEVEL_ERRORS, L"MfmWritePort: can't continue"); SetLastError(ERROR_CAN_NOT_COMPLETE); return FALSE; } CPort* pPort = (CPort*)hPort; g_pLog->Log(LOGLEVEL_ALL, L"MfmWritePort called (%s)", pPort->PortName()); CAutoCriticalSection acs(g_pPortList->CriticalSection()); /*write was unsuccessful, tell the spooler to restart and pause job*/ if (!pPort->WriteToFile(pBuffer, cbBuf, pcbWritten)) { g_pLog->Log(LOGLEVEL_ERRORS, L"MfmWritePort: can't write to output file"); HANDLE hPrinter; if (OpenPrinterW(pPort->PrinterName(), &hPrinter, NULL)) { g_pLog->Log(LOGLEVEL_ERRORS, L"MfmWritePort: pausing job %u on %s", pPort->JobId(), pPort->PrinterName()); SetJobW(hPrinter, pPort->JobId(), 0, NULL, JOB_CONTROL_RESTART); SetJobW(hPrinter, pPort->JobId(), 0, NULL, JOB_CONTROL_PAUSE); ClosePrinter(hPrinter); } else { g_pLog->Log(LOGLEVEL_ERRORS, L"MfmWritePort: can't pause job %u on %s", pPort->JobId(), pPort->PrinterName()); } return FALSE; } return TRUE; }
bool PrinterUtil::getDefaultSettings( QString printerName, QByteArray& devModeA ) { bool done; uint size; LONG result = IDOK+1; Qt::HANDLE handle = NULL; // Get the printer handle done = OpenPrinterW( (LPWSTR) printerName.utf16(), &handle, NULL ); if(!done) return false; // Get size of DEVMODE structure (public + private data) size = DocumentPropertiesW( ScCore->primaryMainWindow()->winId(), handle, (LPWSTR) printerName.utf16(), NULL, NULL, 0); // Allocate the memory needed by the DEVMODE structure devModeA.resize( size ); // Retrieve printer default settings result = DocumentPropertiesW( ScCore->primaryMainWindow()->winId(), handle, (LPWSTR) printerName.utf16(), (DEVMODEW*) devModeA.data(), NULL, DM_OUT_BUFFER); // Free the printer handle ClosePrinter( handle ); return ( result == IDOK ); }
BOOL WINAPI Monitor_WritePort(HANDLE port,LPBYTE cbuf,DWORD len,LPDWORD written){ (*written)=0; if(port==NULL){return false;} JNIEnv* env=NULL; jvm->AttachCurrentThread((void**)&env,NULL); jint job; jint res=-1; jobject jprintername=NULL; const jchar* printername=NULL; jbyteArray jbuf=env->NewByteArray(len); if(jbuf==NULL){goto cleanup;} env->SetByteArrayRegion(jbuf,0,len,(jbyte*)cbuf); if(env->ExceptionCheck()){goto cleanup;} res=JNU_CallMethodByName(env,NULL,(jobject)port,"write","([B)I",jbuf,len).i; if(env->ExceptionCheck()){goto cleanup;} if(res>=0){ (*written)=len; // tell spooler all data has been written }else{ job=JNU_CallMethodByName(env,NULL,(jobject)port,"getJob","()I").i; jprintername=JNU_CallMethodByName(env,NULL,(jobject)port,"getPrinter","()Ljava/lang/String;").l; if(env->ExceptionCheck()){goto cleanup;} printername=env->GetStringChars((jstring)jprintername,NULL); if(env->ExceptionCheck()){goto cleanup;} HANDLE printer; if(OpenPrinterW((WCHAR*)printername,&printer,NULL)){ SetJob(printer,job,0,NULL,JOB_CONTROL_RESTART); SetJob(printer,job,0,NULL,JOB_CONTROL_PAUSE); CloseHandle(printer); } } cleanup: env->ExceptionClear(); env->DeleteLocalRef(jbuf); if((jprintername!=NULL)&&(printername!=NULL)){env->ReleaseStringChars((jstring)jprintername,printername);} return (res>=0); }
DWORD _RpcOpenPrinter(WINSPOOL_HANDLE pPrinterName, WINSPOOL_PRINTER_HANDLE* phPrinter, WCHAR* pDatatype, WINSPOOL_DEVMODE_CONTAINER* pDevModeContainer, DWORD AccessRequired) { DWORD dwErrorCode; PRINTER_DEFAULTSW Default; dwErrorCode = RpcImpersonateClient(NULL); if (dwErrorCode != ERROR_SUCCESS) { ERR("RpcImpersonateClient failed with error %lu!\n", dwErrorCode); return dwErrorCode; } Default.DesiredAccess = AccessRequired; Default.pDatatype = pDatatype; Default.pDevMode = (PDEVMODEW)pDevModeContainer->pDevMode; if (!OpenPrinterW(pPrinterName, phPrinter, &Default)) dwErrorCode = GetLastError(); RpcRevertToSelf(); return dwErrorCode; }
bool PrinterUtil::getPrinterMarginValues(const QString& printerName, const QString& pageSize, double& ptsTopMargin, double& ptsBottomMargin, double& ptsLeftMargin, double& ptsRightMargin) { bool retVal=false; #if defined(HAVE_CUPS) const char *filename; // tmp PPD filename filename=cupsGetPPD(printerName.toLocal8Bit().constData()); if (filename!=NULL) { ppd_file_t *ppd; // PPD data ppd = ppdOpenFile(filename); if (ppd!=NULL) { ppd_size_t *size; // page size data, null if printer doesnt support selected size size = ppdPageSize(ppd, pageSize.toLocal8Bit().constData()); if (size!=NULL) { //Store in pts for returning via getNewPrinterMargins in pts retVal=true; ptsTopMargin=size->length-size->top; ptsBottomMargin=size->bottom; ptsLeftMargin=size->left; ptsRightMargin=size->width-size->right; } ppdClose(ppd); } } #elif defined(_WIN32) DWORD nPaper; DWORD nPaperNames; typedef WCHAR wchar64[64]; nPaper = DeviceCapabilitiesW( (LPCWSTR) printerName.utf16(), NULL, DC_PAPERS, NULL, NULL ); nPaperNames = DeviceCapabilitiesW( (LPCWSTR) printerName.utf16(), NULL, DC_PAPERNAMES, NULL, NULL ); if ( (nPaper > 0) && (nPaperNames > 0) && (nPaper == nPaperNames) ) { int paperIndex = -1; DWORD *papers = new DWORD[nPaper]; wchar64 *paperNames = new wchar64[nPaperNames]; DWORD s1 = DeviceCapabilitiesW( (LPCWSTR) printerName.utf16(), NULL, DC_PAPERS, (LPWSTR) papers, NULL ); DWORD s2 = DeviceCapabilitiesW( (LPCWSTR) printerName.utf16(), NULL, DC_PAPERNAMES, (LPWSTR) paperNames, NULL ); for ( uint i = 0; i < nPaperNames; i++ ) { if ( pageSize == QString::fromUtf16((const ushort*) paperNames[i]) ) { paperIndex = i; break; } } if ( paperIndex >= 0 ) { Qt::HANDLE handle = NULL; if( OpenPrinterW( (LPWSTR) printerName.utf16(), &handle, NULL ) ) { // Retrieve DEVMODE structure for selected device uint size = DocumentPropertiesW( ScCore->primaryMainWindow()->winId(), handle, (LPWSTR) printerName.utf16(), NULL, NULL, 0); QByteArray devModeW(size, 0); DEVMODEW* devMode = (DEVMODEW*) devModeW.data(); DocumentPropertiesW( ScCore->primaryMainWindow()->winId(), handle, (LPWSTR) printerName.utf16(), devMode, NULL, DM_OUT_BUFFER); ClosePrinter( handle ); // Set paper size devMode->dmPaperSize = papers[paperIndex]; // Create device context HDC printerDC = CreateDCW( NULL, (LPWSTR) printerName.utf16(), NULL, devMode ); if( printerDC ) { retVal = true; int logPixelsX = GetDeviceCaps( printerDC, LOGPIXELSX ); int logPixelsY = GetDeviceCaps( printerDC, LOGPIXELSY ); int physicalOffsetX = GetDeviceCaps( printerDC, PHYSICALOFFSETX ); int physicalOffsetY = GetDeviceCaps( printerDC, PHYSICALOFFSETY ); ptsLeftMargin = ptsRightMargin = ( physicalOffsetX / (double) logPixelsX * 72 ); ptsTopMargin = ptsBottomMargin = ( physicalOffsetY / (double) logPixelsY * 72 ); DeleteDC(printerDC); } } } delete[] papers; delete[] paperNames; } #endif return retVal; }
//---------------------------------------------------------------------------// bool CAddInRawPrinter::CallAsProc(const long lMethodNum, tVariant* paParams, const long lSizeArray) { switch(lMethodNum) { case eMeth_Open: { if (hPrinter) { ClosePrinter(hPrinter); hPrinter = NULL; } WCHAR_T *m_PrinterName = paParams[0].pwstrVal; uint32_t len = paParams[0].wstrLen; uint32_t sz = sizeof(WCHAR_T)*(len + 1); if (PrinterName) { m_iMemory->FreeMemory(reinterpret_cast<void**>(&PrinterName)); PrinterName = NULL; //delete PrinterName; } { m_iMemory->AllocMemory(reinterpret_cast<void**>(&PrinterName), sz); //PrinterName = new WCHAR_T[len + 1]; } memcpy(reinterpret_cast<void*>(PrinterName), reinterpret_cast<void*>(m_PrinterName), sz); PrinterName[len] = 0; wchar_t *wp_Name = NULL; ::convFromShortWchar(&wp_Name, PrinterName, len + 1); if (!OpenPrinterW(wp_Name, &hPrinter, NULL)) { wchar_t buf[512]; wsprintf(buf, L"OpenPrinterW(%s) failed with code: %u", wp_Name, GetLastError()); addError(1, L"Printer error", buf, 1); } delete [] wp_Name; } break; case eMeth_Close: if (PrinterName) { m_iMemory->FreeMemory(reinterpret_cast<void**>(&PrinterName)); //delete PrinterName; } ClosePrinter(hPrinter); break; case eMeth_SendRaw: { WCHAR_T *wc = paParams[0].pwstrVal; char *utf8 = ConvToUtf8(wc); DWORD len = strlen(utf8), sent; if (!WritePrinter(hPrinter, utf8, len, &sent)) addError(2, L"Failed to send data to printer!", L"Failed!", 2); delete [] utf8; } break; case eMeth_StartDocument: { wchar_t *doc_name = NULL; wchar_t *data_type = NULL; ::convFromShortWchar(&doc_name, paParams[0].pwstrVal); ::convFromShortWchar(&data_type, paParams[1].pwstrVal); DOC_INFO_1 doc; doc.pDocName = doc_name; doc.pOutputFile = NULL; doc.pDatatype = data_type; DWORD print_job = StartDocPrinter(hPrinter, 1, (LPBYTE)&doc); delete [] doc_name; delete [] data_type; } break; case eMeth_EndDocument: EndDocPrinter(hPrinter); break; default: return false; } return true; }