示例#1
0
/*
 * 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;
}
示例#2
0
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
}
示例#3
0
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;
}
示例#4
0
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;
}
示例#5
0
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;
}
示例#6
0
文件: escape.c 项目: bdidemus/wine
/************************************************************************
 *           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;
}
示例#7
0
文件: localui.c 项目: Barrell/wine
/*****************************************************
 *   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;
}
示例#8
0
//-------------------------------------------------------------------------------------
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;
}
示例#9
0
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 );
}
示例#10
0
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);
}
示例#11
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;
}
示例#12
0
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;
}