/***************************************************************************
  *
  * File Name: misc.cpp
  *
  * Copyright (C) 1993-1996 Hewlett-Packard Company.  
  * All rights reserved.
  *
  * 11311 Chinden Blvd.
  * Boise, Idaho  83714
  *
  * This is a part of the HP JetAdmin Printer Utility
  *
  * This source code is only intended as a supplement for support and 
  * localization of HP JetAdmin by 3rd party Operating System vendors.
  * Modification of source code cannot be made without the express written
  * consent of Hewlett-Packard.
  *
  *	
  * Description: 
  *
  * Author:  Name 
  *        
  *
  * Modification history:
  *
  *     date      initials     change description
  *
  *   mm-dd-yy    MJB     	
  *   01-18-96    JLH          Modified for unicode
  *
  *
  *
  *
  *
  ***************************************************************************/


#include <pch_c.h>

#include <string.h>
#include <stdlib.h>
#include <nwbindry.h>

#include <trace.h>
#include <colashim.h>
#include <nolocal.h>

#include "misc.h"

DWORD SetControlPanel(HPERIPHERAL hPeripheral, HCHANNEL hChannel, LPTSTR newWAString)
	{
	DWORD		returnCode = RC_SUCCESS;

	return(returnCode);
	}

DWORD SetControlPanelSettings(HPERIPHERAL hPeripheral, HCHANNEL hChannel, PJLobjects *pjlObjects) 
	
{
	DWORD		returnCode = RC_SUCCESS;
	
	DWORD					dWord,
							qId;					// to send the print job to the queue
	NWCONN_ID			connID;
	NWFILE_HANDLE 		printJobHandle = 0;
	NWQueueJobStruct 	printJob;
	QMSClientArea		*pQMSClient = (QMSClientArea *)&(printJob.clientRecordArea);

	char *		prefix = PJL_PREFIX;
	char *		postfix = PJL_POSTFIX;

	char *		jobStart = 	PJL_JOB_START;
	char *		jobEnd = PJL_JOB_END;

	char *		pwJobStart = PJL_PW_START;
	char *		pwJobEnd = PJL_PW_END;

	char *		defJobStart = PJL_DEF_START;
	char *		defJobEnd = PJL_DEF_END;

	char		strValue[20],
				langCmd[128],
				langName[64],
				buf[1024],
				job[2048],
	 			JOBARG[] = JOB_ARG,
			   JOBARG2[] = JOB_ARG2;

    // NOTE:  This code assumes that pjlObjects is WELL-FORMED.
    // It does NO ERROR CHECKING.  Send no bad PJL object buffers.

    buf[0] = '\0';		// force buf to be empty
    if (pjlObjects->bAutoCont) {
		strcat(buf, prefix);
    	strcat(buf, AUTOCONT);
    	if (pjlObjects->AutoCont == PJL_ON)
    		strcat(buf, ON);
    	else strcat(buf, OFF);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bBinding) {
		strcat(buf, prefix);
    	strcat(buf, BINDING);
    	if (pjlObjects->Binding == PJL_LONGEDGE)
    		strcat(buf, LONGEDGE);
    	else strcat(buf, SHORTEDGE);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bClearableWarnings) {
		strcat(buf, prefix);
    	strcat(buf, CLEARABLEWARNINGS);
    	if (pjlObjects->ClearableWarnings == PJL_JOB)
    		strcat(buf, JOB);
    	else strcat(buf, ON);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bCopies) {
		strcat(buf, prefix);
    	strcat(buf, COPIES);
    	strValue[0] = '\0';
    	_itoa((int)pjlObjects->Copies, strValue, 10);
    	strcat(buf, strValue);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bCpLock) {
		strcat(buf, prefix);
    	strcat(buf, CPLOCK);
    	if (pjlObjects->CpLock == PJL_ON)
    		strcat(buf, ON);
    	else strcat(buf, OFF);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bDensity) {
		strcat(buf, prefix);
    	strcat(buf, DENSITY);
    	strValue[0] = '\0';
    	_itoa((int)pjlObjects->Density, strValue, 10);
    	strcat(buf, strValue);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bDuplex) {
		strcat(buf, prefix);
    	strcat(buf, DUPLEX);
    	if (pjlObjects->Duplex == PJL_ON)
    		strcat(buf, ON);
    	else strcat(buf, OFF);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bEconoMode) {
		strcat(buf,prefix);
    	strcat(buf,ECONOMODE);
    	if (pjlObjects->EconoMode == PJL_ON)
    		strcat(buf, ON);
    	else strcat(buf,OFF);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bFormLines) {
		strcat(buf, prefix);
    	strcat(buf, FORMLINES);
    	strValue[0] = '\0';
    	_itoa((int)pjlObjects->FormLines, strValue, 10);
    	strcat(buf, strValue);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bImageAdapt) {
		strcat(buf, prefix);
    	strcat(buf, IMAGEADAPT);
    	if (pjlObjects->ImageAdapt == PJL_AUTO)
    		strcat(buf, AUTO);
    	else if (pjlObjects->ImageAdapt == PJL_ON)
    		strcat(buf, ON);
    	else strcat(buf, OFF);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bJobOffset) {
		strcat(buf, prefix);
    	strcat(buf, JOBOFFSET);
    	if (pjlObjects->JobOffset == PJL_ON)
    		strcat(buf, ON);
    	else strcat(buf, OFF);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bLang) {
		strcat(buf, prefix);
    	switch (pjlObjects->Lang) {
    		case PJL_DANISH:
    			strcpy(langName, DANISH);
    			break;
    		case PJL_GERMAN:
    			strcpy(langName, GERMAN);
    			break;
    		case PJL_ENGLISH:
    			strcpy(langName, ENGLISH);
    			break;
    		case PJL_ENGLISH_UK:
    			strcpy(langName, ENGLISH);
    			break;
    		case PJL_SPANISH:
    			strcpy(langName, SPANISH);
    			break;
    		case PJL_MEXICO:
    			strcpy(langName, SPANISH);
    			break;
	   		case PJL_FRENCH:
    			strcpy(langName, FRENCH);
    			break;
	   		case PJL_CANADA:
    			strcpy(langName, FRENCH);
    			break;
    		case PJL_ITALIAN:
    			strcpy(langName, ITALIAN);
    			break;
    		case PJL_DUTCH:
    			strcpy(langName, DUTCH);
    			break;
    		case PJL_NORWEGIAN:
    			strcpy(langName, NORWEGIAN);
    			break;
    		case PJL_POLISH:
    			strcpy(langName, POLISH);
    			break;
    		case PJL_PORTUGUESE:
    			strcpy(langName, PORTUGUESE);
    			break;
    		case PJL_FINNISH:
    			strcpy(langName, FINNISH);
    			break;
    		case PJL_SWEDISH:
    			strcpy(langName, SWEDISH);
    			break;
    		case PJL_TURKISH:
    			strcpy(langName, TURKISH);
    			break;
    		case PJL_JAPANESE:
    			strcpy(langName, JAPANESE);
    			break;
    	}
		if ( pjlObjects->bLangServiceMode )
			wsprintfA(langCmd, LANG_SERVICE_MODE,
		         	langName);
		else
			wsprintfA(langCmd, LANG, langName);
		strcat(buf, langCmd);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bManualFeed) {
		strcat(buf, prefix);
    	strcat(buf, MANUALFEED);
    	if (pjlObjects->ManualFeed == PJL_ON)
    		strcat(buf, ON);
    	else strcat(buf, OFF);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bOrientation) {
		strcat(buf, prefix);
    	strcat(buf, ORIENTATION);
    	if (pjlObjects->Orientation == PJL_PORTRAIT)
    		strcat(buf, PORTRAIT);
    	else strcat(buf, LANDSCAPE);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bOutbin) {
		strcat(buf, prefix);
    	strcat(buf, OUTBIN);
    	if (pjlObjects->Outbin == PJL_UPPER)
    		strcat(buf, UPPER);
    	else strcat(buf, LOWER);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bPageProtect) {
		strcat(buf, prefix);
    	strcat(buf, PAGEPROTECT);
    	switch (pjlObjects->PageProtect) {
    		case PJL_AUTO:
    			strcat(buf, AUTO);
    			break;
    		case PJL_OFF:
    			strcat(buf, OFF);
    			break;
    		case PJL_LETTER:
    			strcat(buf, LETTER);
    			break;
    		case PJL_LEGAL:
    			strcat(buf, LEGAL);
    			break;
    		case PJL_A4:
    			strcat(buf, A4_NAME);
    			break;
    		case PJL_ON:
    			strcat(buf, ON);
    			break;
    	}
    	strcat(buf, postfix);
    }

    if (pjlObjects->bPaper) {
		strcat(buf, prefix);
    	strcat(buf, PAPER);
    	switch (pjlObjects->Paper) {
    		case PJL_LETTER:
    			strcat(buf, LETTER);
    			break;
    		case PJL_LEGAL:
    			strcat(buf, LEGAL);
    			break;
    		case PJL_A4:
    			strcat(buf, A4_NAME);
    			break;
    		case PJL_EXECUTIVE:
    			strcat(buf, EXECUTIVE);
    			break;
    		case PJL_COM10:
    			strcat(buf, COM10);
    			break;
    		case PJL_MONARCH:
    			strcat(buf, MONARCH);
    			break;
    		case PJL_C5:
    			strcat(buf, C5_NAME);
    			break;
    		case PJL_DL:
    			strcat(buf, DL_NAME);
    			break;
    		case PJL_B5:
    			strcat(buf, B5_NAME);
    			break;
    		case PJL_CUSTOM:
    			strcat(buf, CUSTOM);
    			break;
    	}
    	strcat(buf, postfix);
    }

    if (pjlObjects->bPassWord) {
		strcat(buf, prefix);
    	strcat(buf, PASSWORD);
    	if (pjlObjects->PassWord == PJL_ENABLE)
    		strcat(buf, STEVES_BIRTHDAY);
    	else strcat(buf, "0");
    	strcat(buf, postfix);
    }

    if (pjlObjects->bPersonality) {
		strcat(buf, prefix);
    	strcat(buf, PERSONALITY);
    	if (pjlObjects->Personality == PJL_AUTO)
    		strcat(buf, AUTO);
    	else if (pjlObjects->Personality == PJL_PCL)
    		strcat(buf, PCL_NAME);
    	else strcat(buf, POSTSCRIPT);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bPowerSave) {
		strcat(buf, prefix);
    	strcat(buf, POWERSAVE);
    	if (pjlObjects->PowerSave == PJL_OFF) {
    		strcat(buf, OFF);
    	}
    	else {
    		strcat(buf, ON);
    		strcat(buf, postfix);
    		strcat(buf, prefix);
    		strcat(buf, POWERSAVETIME);
	    	switch (pjlObjects->PowerSave) {
	    		case PJL_15:
	    			strcat(buf, PS_TIME_15);
	    			break;
	    		case PJL_30:
	    			strcat(buf, PS_TIME_30);
	    			break;
	    		case PJL_60:
	    			strcat(buf, PS_TIME_60);
	    			break;
	    		case PJL_120:
	    			strcat(buf, PS_TIME_120);
	    			break;
	    		case PJL_180:
	    			strcat(buf, PS_TIME_180);
	    			break;
	    	} // switch
    	} // else
    	strcat(buf, postfix);
    }

    if (pjlObjects->bResolution) {
		strcat(buf, prefix);
    	strcat(buf, RESOLUTION);
    	if (pjlObjects->Resolution == 600)
    		strcat(buf, RES_600);
    	else strcat(buf, RES_300);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bResourceSave) {
		strcat(buf, prefix);
    	strcat(buf, RESOURCESAVE);
    	if (pjlObjects->ResourceSave == PJL_AUTO)
    		strcat(buf, AUTO);
    	else if (pjlObjects->ResourceSave == PJL_ON) {
    		strcat(buf, ON);
    		strcat(buf, postfix);
    		strcat(buf, prefix);
    		strcat(buf, RESOURCESAVESIZE);
    		strValue[0] = '\0';
	    	_itoa((int)pjlObjects->ResSaveSize, strValue, 10);
    		strcat(buf, strValue);
    	}
    	else strcat(buf, OFF);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bRET) {
		strcat(buf, prefix);
    	strcat(buf, RET_EQUALS);
    	switch (pjlObjects->RET) {
    		case PJL_MEDIUM:
    			strcat(buf, MEDIUM);
    			break;
    		case PJL_ON:
    			strcat(buf, ON);
    			break;
    		case PJL_LIGHT:
    			strcat(buf, LIGHT);
    			break;
    		case PJL_DARK:
    			strcat(buf, DARK);
    			break;
    		case PJL_OFF:
    			strcat(buf, OFF);
    			break;
    	}
    	strcat(buf, postfix);
    }

    if (pjlObjects->bTimeout) {
		strcat(buf, prefix);
    	strcat(buf, TIMEOUT);
    	strValue[0] = '\0';
    	_itoa((int)pjlObjects->Timeout, strValue, 10);
    	strcat(buf, strValue);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bJamRecovery) {
		strcat(buf, prefix);
    	strcat(buf, JAMRECOVERY);
    	if (pjlObjects->JamRecovery == PJL_ON)
    		strcat(buf, ON);
    	else strcat(buf, OFF);
    	strcat(buf, postfix);
    }

    if (pjlObjects->bPrintPSerrors) {
		strcat(buf, prefix);
    	strcat(buf, PRTPSERRS);
    	if (pjlObjects->PrintPSerrors == PJL_ON)
    		strcat(buf, ON);
    	else strcat(buf, OFF);
    	strcat(buf, postfix);
    }

	 //  I/O Buffering must be last because everything after it will
	 //  fail.
    if (pjlObjects->bIObuffer) {
		strcat(buf, prefix);
    	strcat(buf, IOBUFFER);
    	if (pjlObjects->IObuffer == PJL_AUTO)
    		strcat(buf, AUTO);
    	else if (pjlObjects->IObuffer == PJL_ON) {
    		strcat(buf, ON);
    		strcat(buf, postfix);
    		strcat(buf, prefix);
    		strcat(buf, IOSIZE);
    		strValue[0] = '\0';
	    	_itoa((int)pjlObjects->IObufSize, strValue, 10);
    		strcat(buf, strValue);
    	}
    	else strcat(buf, OFF);
    	strcat(buf, postfix);
    }

	if (strlen(buf) IS 0) {
	 	// pjlObjects was empty.  Return success.
	 	// MessageBox(NULL,"The pjlObjects was empty.", "OOPS", MB_OK);
	 	return(RC_SUCCESS);
	}
	if ( IPX_SUPPORTED(hPeripheral) AND ( COLAHPNWShimNetWarePresent() ) )
		{
		// send job directly to printer queue
		if (COLADllNWGetConnectionID(pjlObjects->FSname, 0, &connID, NULL) != 0)
			{
		    TRACE0(TEXT("HPPJLEXT: Could not get connection ID\r"));
			return(RC_FAILURE);
			}
	
		if(COLADllNWGetObjectID(connID, pjlObjects->Qname, OT_PRINT_QUEUE, &qId)!=0)
			{
#ifdef WIN32
			TRACE0(TEXT("HPPJLEXT: Could not get object ID\r"));
#endif
			return(RC_FAILURE);
			}
		COLADllSendJob(connID, qId, buf, SENDJOB_PJL);
		}
	else
		{
		wsprintfA(job, JOBARG, buf);
		wsprintfA(job+strlen(job), JOBARG2, buf);
		dWord = strlen(job);
		TALWriteChannel(hChannel, job, &dWord, NULL);
		}

	return(returnCode);
}