summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerald Carter <jerry@samba.org>2005-07-11 16:55:10 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 10:58:19 -0500
commit18609ce1af72802accd1e5e85689db69e8b0c914 (patch)
tree25361a25f9b195092036705326f749f592738a5c
parente24397f084282de2b88dc83995740037e8c4cf32 (diff)
downloadsamba-18609ce1af72802accd1e5e85689db69e8b0c914.tar.gz
samba-18609ce1af72802accd1e5e85689db69e8b0c914.tar.bz2
samba-18609ce1af72802accd1e5e85689db69e8b0c914.zip
r8322: * get RegSetValue() working for printer subkey values
(not immediate values below the <printer name> key yet. (This used to be commit a872ea5f0e29f7b585574a56b52a5eb44cb92278)
-rw-r--r--source3/registry/reg_printing.c172
-rw-r--r--source3/rpc_server/srv_spoolss_nt.c2
2 files changed, 170 insertions, 4 deletions
diff --git a/source3/registry/reg_printing.c b/source3/registry/reg_printing.c
index 60ae68c666..9a6d672211 100644
--- a/source3/registry/reg_printing.c
+++ b/source3/registry/reg_printing.c
@@ -55,7 +55,6 @@ struct reg_dyn_tree {
*********************************************************************
*********************************************************************/
-
/**********************************************************************
move to next non-delimter character
*********************************************************************/
@@ -275,6 +274,7 @@ done:
}
/**********************************************************************
+ Take a printer name and call add_printer_hook() if necessary
*********************************************************************/
static BOOL add_printers_by_registry( REGSUBKEY_CTR *subkeys )
@@ -500,20 +500,186 @@ done:
/**********************************************************************
*********************************************************************/
+#define REG_IDX_ATTRIBUTES 1
+#define REG_IDX_PRIORITY 2
+#define REG_IDX_DEFAULT_PRIORITY 3
+#define REG_IDX_CHANGEID 4
+#define REG_IDX_STATUS 5
+#define REG_IDX_STARTTIME 6
+#define REG_IDX_NAME 7
+#define REG_IDX_LOCATION 8
+#define REG_IDX_DESCRIPTION 9
+#define REG_IDX_PARAMETERS 10
+#define REG_IDX_PORT 12
+#define REG_IDX_SHARENAME 13
+#define REG_IDX_DRIVER 14
+#define REG_IDX_SEP_FILE 15
+#define REG_IDX_PRINTPROC 16
+#define REG_IDX_DATATYPE 17
+#define REG_IDX_DEVMODE 18
+#define REG_IDX_SECDESC 19
+#define REG_IDX_UNTILTIME 20
+
+struct {
+ const char *name;
+ int index;
+} printer_values_map[] = {
+ { "Attributes", REG_IDX_ATTRIBUTES },
+ { "Priority", REG_IDX_PRIORITY },
+ { "Default Priority", REG_IDX_DEFAULT_PRIORITY },
+ { "ChangeID", REG_IDX_CHANGEID },
+ { "Status", REG_IDX_STATUS },
+ { "StartTime", REG_IDX_STARTTIME },
+ { "UntilTime", REG_IDX_UNTILTIME },
+ { "Name", REG_IDX_NAME },
+ { "Location", REG_IDX_LOCATION },
+ { "Descrioption", REG_IDX_DESCRIPTION },
+ { "Parameters", REG_IDX_PARAMETERS },
+ { "Port", REG_IDX_PORT },
+ { "Share Name", REG_IDX_SHARENAME },
+ { "Printer Driver", REG_IDX_DRIVER },
+ { "Separator File", REG_IDX_SEP_FILE },
+ { "Print Processor", REG_IDX_PRINTPROC },
+ { "Datatype", REG_IDX_DATATYPE },
+ { "Default Devmode", REG_IDX_DEVMODE },
+ { "Security", REG_IDX_SECDESC },
+ { NULL, -1 }
+};
+
+
+static int find_valuename_index( const char *valuename )
+{
+ int i;
+
+ for ( i=0; printer_values_map[i].name; i++ ) {
+ if ( strequal( valuename, printer_values_map[i].name ) )
+ return printer_values_map[i].index;
+ }
+
+ return -1;
+}
+
+/**********************************************************************
+ *********************************************************************/
+
+static void convert_values_to_printer_info_2( NT_PRINTER_INFO_LEVEL_2 *printer2, REGVAL_CTR *values )
+{
+ int num_values = regval_ctr_numvals( values );
+ uint32 value_index;
+ REGISTRY_VALUE *reg_value;
+ int i;
+
+ for ( i=0; i<num_values; i++ ) {
+ reg_value = regval_ctr_specific_value( values, i );
+ value_index = find_valuename_index( regval_name( reg_value ) );
+
+ switch( value_index ) {
+ case REG_IDX_ATTRIBUTES:
+ break;
+ case REG_IDX_PRIORITY:
+ break;
+ case REG_IDX_DEFAULT_PRIORITY:
+ break;
+ case REG_IDX_CHANGEID:
+ break;
+ case REG_IDX_STATUS:
+ break;
+ case REG_IDX_STARTTIME:
+ break;
+ case REG_IDX_UNTILTIME:
+ break;
+ case REG_IDX_NAME:
+ break;
+ case REG_IDX_LOCATION:
+ break;
+ case REG_IDX_DESCRIPTION:
+ break;
+ case REG_IDX_PARAMETERS:
+ break;
+ case REG_IDX_PORT:
+ break;
+ case REG_IDX_SHARENAME:
+ break;
+ case REG_IDX_DRIVER:
+ break;
+ case REG_IDX_SEP_FILE:
+ break;
+ case REG_IDX_PRINTPROC:
+ break;
+ case REG_IDX_DATATYPE:
+ break;
+ case REG_IDX_DEVMODE:
+ break;
+ case REG_IDX_SECDESC:
+ break;
+ default:
+ /* unsupported value...what to do here ? */
+ DEBUG(0,("convert_values_to_printer_info_2: Unsupported registry value [%s]\n",
+ regval_name( reg_value ) ));
+ }
+ }
+
+ return;
+}
+
+/**********************************************************************
+ *********************************************************************/
+
static BOOL key_printers_store_values( const char *key, REGVAL_CTR *values )
{
char *printers_key;
+ char *printername, *keyname;
+ NT_PRINTER_INFO_LEVEL *printer = NULL;
+ WERROR result;
printers_key = strip_printers_prefix( key );
/* values in the top level key get stored in the registry */
if ( !printers_key ) {
- /* normalize on thw 'HKLM\SOFTWARE\....\Print\Printers' ket */
+ /* normalize on the 'HKLM\SOFTWARE\....\Print\Printers' key */
return regdb_store_values( KEY_WINNT_PRINTERS, values );
}
- return False;
+ reg_split_path( printers_key, &printername, &keyname );
+
+ if ( !W_ERROR_IS_OK(get_a_printer(NULL, &printer, 2, printername) ) )
+ return False;
+
+ /* deal with setting values directly under the printername */
+
+ if ( !keyname ) {
+ convert_values_to_printer_info_2( printer->info_2, values );
+ }
+ else {
+ int num_values = regval_ctr_numvals( values );
+ int i;
+ REGISTRY_VALUE *val;
+
+ delete_printer_key( &printer->info_2->data, keyname );
+
+ /* deal with any subkeys */
+ for ( i=0; i<num_values; i++ ) {
+ val = regval_ctr_specific_value( values, i );
+ result = set_printer_dataex( printer, keyname,
+ regval_name( val ),
+ regval_type( val ),
+ regval_data_p( val ),
+ regval_size( val ) );
+ if ( !W_ERROR_IS_OK(result) ) {
+ DEBUG(0,("key_printers_store_values: failed to set printer data [%s]!\n",
+ keyname));
+ free_a_printer( &printer, 2 );
+ return False;
+ }
+ }
+ }
+
+ result = mod_a_printer( printer, 2 );
+
+ free_a_printer( &printer, 2 );
+
+ return W_ERROR_IS_OK(result);
}
/*********************************************************************
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index 19ef3700e6..0329471d49 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -2261,7 +2261,7 @@ static WERROR delete_printer_dataex( NT_PRINTER_INFO_LEVEL *printer, const char
Internal routine for storing printerdata
***************************************************************************/
-static WERROR set_printer_dataex( NT_PRINTER_INFO_LEVEL *printer, const char *key, const char *value,
+WERROR set_printer_dataex( NT_PRINTER_INFO_LEVEL *printer, const char *key, const char *value,
uint32 type, uint8 *data, int real_len )
{
delete_printer_data( printer->info_2, key, value );