int GetPrinterSettings( cups_option_t *p_cups_opt, int num_opt, ParamList **p_list, int *listNum ) { char *p_ppd_name = getenv("PPD"); ppd_file_t *p_ppd; ppd_choice_t *p_choice; int result = -1; PpdToOptKey *p_opt_key_table = alloc_opt_key_table(p_ppd_name); PpdToOptKey *p_table = p_opt_key_table; int numCnt = 0; char choice[BUF_SIZE]; ParamList *local_p_list = NULL; static const char *libpath; if ( (p_cups_opt == NULL) || (listNum == NULL) ) goto onErr; *listNum = 0; DEBUG_PRINT2( "DEBUG:[rastertocanonij] PPD Path(%s)\n", p_ppd_name ); if ( (p_ppd = ppdOpenFile( p_ppd_name )) == NULL ) goto onErr; ppdMarkDefaults(p_ppd); cupsMarkOptions(p_ppd, num_opt, p_cups_opt); /* add libpath */ libpath = GetExecProgPath(); if ( libpath != NULL ){ param_list_add( &local_p_list, "--filterpath", libpath, strlen(libpath) + 1 ); } while( p_table->ppd_key != NULL ){ p_choice = ppdFindMarkedChoice( p_ppd, p_table->ppd_key ); if ( p_choice ) { DEBUG_PRINT3( "DEBUG:[rastertocanonij] OPTION(%s) / VALUE(%s)\n", p_table->ppd_key, p_choice->choice ); } else { DEBUG_PRINT2( "DEBUG:[rastertocanonij] OPTION(%s) / VALUE(novalue)\n", p_table->ppd_key ); } if ( p_choice != NULL ){ strcpy( choice, p_choice->choice ); //to_lower_except_size_X(choice); param_list_add( &local_p_list, p_table->opt_key, choice, strlen(choice) + 1 ); numCnt++; } p_table++; } *listNum = numCnt; *p_list = local_p_list; result = 0; onErr: return result; }
int main( int argc, char *argv[] ) { int fd = 0; int opt, opt_index; int result = -1; long bufSize = 0; // long writtenSize; int writtenSize = 0; long writtenSize_long = 0; char *bufTop = NULL; CNCL_P_SETTINGS Settings; char jobID[CN_START_JOBID_LEN]; char libPathBuf[CN_LIB_PATH_LEN]; void *libclss = NULL; struct option long_opt[] = { { "version", required_argument, NULL, OPT_VERSION }, { "filterpath", required_argument, NULL, OPT_FILTERPATH }, { "papersize", required_argument, NULL, OPT_PAPERSIZE }, { "mediatype", required_argument, NULL, OPT_MEDIATYPE }, { "grayscale", required_argument, NULL, OPT_COLORMODE }, { "duplexprint", required_argument, NULL, OPT_DUPLEXPRINT }, { "jobid", required_argument, NULL, OPT_JOBID }, { "uuid", required_argument, NULL, OPT_UUID }, { 0, 0, 0, 0 }, }; const char *p_ppd_name = getenv("PPD"); uint8_t *xmlBuf = NULL; int xmlBufSize; int retSize; char *tmpBuf = NULL; char uuid[UUID_LEN + 1]; DEBUG_PRINT( "[tocanonij] start tocanonij\n" ); /* init CNCL API */ GETSETCONFIGURATIONCOMMAND = NULL; GETSENDDATAPWGRASTERCOMMAND = NULL; GETPRINTCOMMAND = NULL; GETSTRINGWITHTAGFROMFILE = NULL; GETSETPAGECONFIGUARTIONCOMMAND = NULL; MAKEBJLSETTIMEJOB = NULL; GetProtocol = NULL; ParseCapabilityResponsePrint_HostEnv=NULL; MakeCommand_StartJob3 = NULL; ParseCapabilityResponsePrint_DateTime = NULL; MakeCommand_SetJobConfiguration = NULL; /* Init Settings */ memset( &Settings, 0x00, sizeof(CNCL_P_SETTINGS) ); InitpSettings( &Settings ); memset( uuid, '\0', sizeof(uuid) ); while( (opt = getopt_long( argc, argv, "0:", long_opt, &opt_index )) != -1) { switch( opt ) { case OPT_VERSION: DEBUG_PRINT3( "[tocanonij] OPTION(%s):VALUE(%s)\n", long_opt[opt_index].name, optarg ); break; case OPT_FILTERPATH: DEBUG_PRINT3( "[tocanonij] OPTION(%s):VALUE(%s)\n", long_opt[opt_index].name, optarg ); snprintf( libPathBuf, CN_LIB_PATH_LEN, "%s%s", optarg, CN_CNCL_LIBNAME ); break; case OPT_PAPERSIZE: DEBUG_PRINT3( "[tocanonij] OPTION(%s):VALUE(%s)\n", long_opt[opt_index].name, optarg ); Settings.papersize = ConvertStrToID( optarg, papersizeTbl ); if ( IsBorderless( optarg ) ){ Settings.borderlessprint = CNCL_PSET_BORDERLESS_ON; } else { Settings.borderlessprint = CNCL_PSET_BORDERLESS_OFF; } break; case OPT_MEDIATYPE: DEBUG_PRINT3( "[tocanonij] OPTION(%s):VALUE(%s)\n", long_opt[opt_index].name, optarg ); Settings.mediatype = ConvertStrToID( optarg, mediatypeTbl ); DEBUG_PRINT2( "[tocanonij] media : %d\n", Settings.mediatype ); break; #if 0 case OPT_BORDERLESSPRINT: DEBUG_PRINT3( "[tocanonij] OPTION(%s):VALUE(%s)\n", long_opt[opt_index].name, optarg ); if ( IsBorderless( optarg ) ){ Settings.borderlessprint = CNCL_PSET_BORDERLESS_ON; } else { Settings.borderlessprint = CNCL_PSET_BORDERLESS_OFF; } break; #endif case OPT_COLORMODE: DEBUG_PRINT3( "[tocanonij] OPTION(%s):VALUE(%s)\n", long_opt[opt_index].name, optarg ); Settings.colormode = ConvertStrToID( optarg, colormodeTbl ); break; case OPT_DUPLEXPRINT: DEBUG_PRINT3( "[tocanonij] OPTION(%s):VALUE(%s)\n", long_opt[opt_index].name, optarg ); //Settings.duplexprint = CNCL_PSET_DUPLEX_OFF; Settings.duplexprint = ConvertStrToID( optarg, duplexprintTbl); break; case OPT_UUID: strncpy( uuid, optarg, strlen(optarg) ); break; case OPT_JOBID: if( strlen( uuid ) == 0 ){ strncpy( uuid, optarg, strlen(optarg) ); } break; case '?': fprintf( stderr, "Error: invalid option %c:\n", optopt); break; default: break; } } /* dlopen */ /* Make progamname with path of execute progname. */ //snprintf( libPathBuf, CN_LIB_PATH_LEN, "%s%s", GetExecProgPath(), CN_CNCL_LIBNAME ); DEBUG_PRINT2( "[tocanonij] libPath : %s\n", libPathBuf ); if ( access( libPathBuf, R_OK ) ){ strncpy( libPathBuf, CN_CNCL_LIBNAME, CN_LIB_PATH_LEN ); } DEBUG_PRINT2( "[tocanonij] libPath : %s\n", libPathBuf ); libclss = dlopen( libPathBuf, RTLD_LAZY ); if ( !libclss ) { fprintf( stderr, "Error in dlopen\n" ); goto onErr1; } GETSETCONFIGURATIONCOMMAND = dlsym( libclss, "CNCL_GetSetConfigurationCommand" ); if ( dlerror() != NULL ) { fprintf( stderr, "Error in CNCL_GetSetConfigurationCommand. API not Found.\n" ); goto onErr2; } GETSENDDATAPWGRASTERCOMMAND = dlsym( libclss, "CNCL_GetSendDataPWGRasterCommand" ); if ( dlerror() != NULL ) { fprintf( stderr, "Error in CNCL_GetSendDataPWGRasterCommand\n" ); goto onErr2; } GETPRINTCOMMAND = dlsym( libclss, "CNCL_GetPrintCommand" ); if ( dlerror() != NULL ) { fprintf( stderr, "Error in CNCL_GetPrintCommand\n" ); goto onErr2; } GETSTRINGWITHTAGFROMFILE = dlsym( libclss, "CNCL_GetStringWithTagFromFile" ); if ( dlerror() != NULL ) { fprintf( stderr, "Error in CNCL_GetStringWithTagFromFile\n" ); goto onErr2; } GETSETPAGECONFIGUARTIONCOMMAND = dlsym( libclss, "CNCL_GetSetPageConfigurationCommand" ); if ( dlerror() != NULL ) { fprintf( stderr, "Load Error in CNCL_GetSetPageConfigurationCommand\n" ); goto onErr2; } MAKEBJLSETTIMEJOB = dlsym( libclss, "CNCL_MakeBJLSetTimeJob" ); if ( dlerror() != NULL ) { fprintf( stderr, "Load Error in CNCL_MakeBJLSetTimeJob\n" ); goto onErr2; } GetProtocol = dlsym( libclss, "CNCL_GetProtocol" ); if ( dlerror() != NULL ) { fprintf( stderr, "Load Error in CNCL_MakeBJLSetTimeJob\n" ); goto onErr2; } ParseCapabilityResponsePrint_HostEnv = dlsym( libclss, "CNCL_ParseCapabilityResponsePrint_HostEnv" ); if ( dlerror() != NULL ) { fprintf( stderr, "Load Error in CNCL_ParseCapabilityResponsePrint_HostEnv\n" ); goto onErr2; } MakeCommand_StartJob3 = dlsym( libclss, "CNCL_MakeCommand_StartJob3" ); if ( dlerror() != NULL ) { fprintf( stderr, "Load Error in CNCL_MakeCommand_StartJob3\n" ); goto onErr2; } ParseCapabilityResponsePrint_DateTime = dlsym( libclss, "CNCL_ParseCapabilityResponsePrint_DateTime" ); if ( dlerror() != NULL ) { fprintf( stderr, "Load Error in CNCL_ParseCapabilityResponsePrint_DateTime\n" ); goto onErr2; } MakeCommand_SetJobConfiguration = dlsym( libclss, "CNCL_MakeCommand_SetJobConfiguration" ); if ( dlerror() != NULL ) { fprintf( stderr, "Load Error in CNCL_MakeCommand_SetJobConfiguration\n" ); goto onErr2; } /* Check Settings */ if ( CheckSettings( &Settings ) != 0 ) goto onErr2; #if 1 /* Dump Settings */ DumpSettings( &Settings ); #endif // const char *p_ppd_name = getenv("PPD"); CAPABILITY_DATA capability; memset(&capability, '\0', sizeof(CAPABILITY_DATA)); if( ! GetCapabilityFromPPDFile(p_ppd_name, &capability) ){ goto onErr3; } int prot = GetProtocol( (char *)capability.deviceID, capability.deviceIDLength ); if( prot == 2 ){ xmlBufSize = GETSTRINGWITHTAGFROMFILE( p_ppd_name, CNCL_FILE_TAG_CAPABILITY, (int *)CNCL_DECODE_EXEC, &xmlBuf ); unsigned short hostEnv = 0; hostEnv = ParseCapabilityResponsePrint_HostEnv( xmlBuf, xmlBufSize ); /* Set JobID */ strncpy( jobID, CN_START_JOBID2, sizeof(CN_START_JOBID2) ); /* Allocate Buffer */ bufSize = sizeof(char) * CN_BUFSIZE; if ( (bufTop = malloc( bufSize )) == NULL ) goto onErr2; /* Write StartJob Command */ int ret = 0; ret = MakeCommand_StartJob3( hostEnv, uuid, jobID, bufTop, bufSize, &writtenSize ); if ( ret != 0 ) { fprintf( stderr, "Error in CNCL_GetPrintCommand\n" ); goto onErr2; } /* WriteData */ if ( (retSize = write( 1, bufTop, writtenSize )) != writtenSize ) goto onErr2; char dateTime[15]; memset(dateTime, '\0', sizeof(dateTime)); ret = ParseCapabilityResponsePrint_DateTime( xmlBuf, xmlBufSize ); if( ret == 2 ){ time_t timer = time(NULL); struct tm *date = localtime(&timer); sprintf(dateTime, "%d%02d%02d%02d%02d%02d", date->tm_year+1900, date->tm_mon+1, date->tm_mday, date->tm_hour, date->tm_min, date->tm_sec); if ( (tmpBuf = malloc( bufSize )) == NULL ) goto onErr2; ret = MakeCommand_SetJobConfiguration( jobID, dateTime, tmpBuf, bufSize, &writtenSize ); /* WriteData */ if ( (retSize = write( 1, tmpBuf, writtenSize )) != writtenSize ) goto onErr2; // writtenSize += tmpWrittenSize; } } else{ /* Set JobID */ strncpy( jobID, CN_START_JOBID, sizeof(CN_START_JOBID) ); /* OutputSetTime */ if ( OutputSetTime( 1, jobID ) != 0 ) goto onErr2; /* Allocate Buffer */ bufSize = sizeof(char) * CN_BUFSIZE; if ( (bufTop = malloc( bufSize )) == NULL ) goto onErr2; /* Write StartJob Command */ if ( GETPRINTCOMMAND( bufTop, bufSize, &writtenSize_long, jobID, CNCL_COMMAND_START1 ) != 0 ) { fprintf( stderr, "Error in CNCL_GetPrintCommand\n" ); goto onErr2; } /* WriteData */ if ( (retSize = write( 1, bufTop, writtenSize_long )) != writtenSize_long ) goto onErr2; } /* Write SetConfiguration Command */ if ( (xmlBufSize = GETSTRINGWITHTAGFROMFILE( p_ppd_name, CNCL_FILE_TAG_CAPABILITY, (int*)CNCL_DECODE_EXEC, &xmlBuf )) < 0 ){ DEBUG_PRINT2( "[tocanonij] p_ppd_name : %s\n", p_ppd_name ); DEBUG_PRINT2( "[tocanonij] xmlBufSize : %d\n", xmlBufSize ); fprintf( stderr, "Error in CNCL_GetStringWithTagFromFile\n" ); goto onErr3; } if ( GETSETCONFIGURATIONCOMMAND( &Settings, jobID, bufSize, (void *)xmlBuf, xmlBufSize, bufTop, &writtenSize_long ) != 0 ){ fprintf( stderr, "Error in CNCL_GetSetConfigurationCommand\n" ); goto onErr3; } /* WriteData */ retSize = write( 1, bufTop, writtenSize_long ); /* Write Page Data */ while ( 1 ) { int readBytes = 0; int writeBytes; char *pCurrent; CNDATA CNData; long readSize = 0; unsigned short next_page; memset( &CNData, 0, sizeof(CNDATA) ); /* read magic number */ readBytes = read( fd, &CNData, sizeof(CNDATA) ); if ( readBytes > 0 ){ if ( CNData.magic_num != MAGIC_NUMBER_FOR_CNIJPWG ){ fprintf( stderr, "Error illeagal MagicNumber\n" ); goto onErr3; } if ( CNData.image_size < 0 ){ fprintf( stderr, "Error illeagal dataSize\n" ); goto onErr3; } } else if ( readBytes < 0 ){ if ( errno == EINTR ) continue; fprintf( stderr, "DEBUG:[tocanonij] tocnij read error, %d\n", errno ); goto onErr3; } else { DEBUG_PRINT( "DEBUG:[tocanonij] !!!DATA END!!!\n" ); break; /* data end */ } /* Write Next Page Info */ if ( CNData.next_page ) { next_page = CNCL_PSET_NEXTPAGE_ON; } else { next_page = CNCL_PSET_NEXTPAGE_OFF; } if ( GETSETPAGECONFIGUARTIONCOMMAND( jobID, next_page, bufTop, bufSize, &writtenSize_long ) != 0 ) { fprintf( stderr, "Error in CNCL_GetPrintCommand\n" ); goto onErr3; } /* WriteData */ if ( (retSize = write( 1, bufTop, writtenSize_long )) != writtenSize_long ) goto onErr3; /* Write SendData Command */ memset( bufTop, 0x00, bufSize ); readSize = CNData.image_size; if ( GETSENDDATAPWGRASTERCOMMAND( jobID, readSize, bufSize, bufTop, &writtenSize_long ) != 0 ) { DEBUG_PRINT( "Error in CNCL_GetSendDataJPEGCommand\n" ); goto onErr3; } /* WriteData */ retSize = write( 1, bufTop, writtenSize_long ); while( readSize ){ pCurrent = bufTop; if ( readSize - bufSize > 0 ){ readBytes = read( fd, bufTop, bufSize ); DEBUG_PRINT2( "[tocanonij] PASS tocanonij READ1<%d>\n", readBytes ); if ( readBytes < 0 ) { if ( errno == EINTR ) continue; } readSize -= readBytes; } else { readBytes = read( fd, bufTop, readSize ); DEBUG_PRINT2( "[tocanonij] PASS tocanonij READ2<%d>\n", readBytes ); if ( readBytes < 0 ) { if ( errno == EINTR ) continue; } readSize -= readBytes; } do { writeBytes = write( 1, pCurrent, readBytes ); DEBUG_PRINT2( "[tocanonij] PASS tocanonij WRITE<%d>\n", writeBytes ); if( writeBytes < 0){ if ( errno == EINTR ) continue; goto onErr3; } readBytes -= writeBytes; pCurrent += writeBytes; } while( writeBytes > 0 ); } } /* CNCL_GetPrintCommand */ if ( GETPRINTCOMMAND( bufTop, bufSize, &writtenSize_long, jobID, CNCL_COMMAND_END ) != 0 ) { DEBUG_PRINT( "Error in CNCL_GetPrintCommand\n" ); goto onErr3; } /* WriteData */ retSize = write( 1, bufTop, writtenSize_long ); DEBUG_PRINT( "[tocanonij] to_cnijf <end>\n" ); result = 0; onErr3: if ( xmlBuf != NULL ){ free( xmlBuf ); } onErr2: if ( bufTop != NULL ){ free( bufTop ); } onErr1: if ( libclss != NULL ) { dlclose( libclss ); } if( tmpBuf != NULL ){ free(tmpBuf); } return result; }