r8089: successfully delete printer subkeys via the registry....now for values
authorGerald Carter <jerry@samba.org>
Sun, 3 Jul 2005 02:05:01 +0000 (02:05 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:58:10 +0000 (10:58 -0500)
(This used to be commit d3427960b0676c506c639b582a2544dc58990c9e)

source3/printing/nt_printing.c
source3/registry/reg_printing.c

index 47e0af963344d7e7ed57e89f4206fbb85652cd50..b3a2ca5893b7f019db511a02faa45f846ec867df 100644 (file)
@@ -2560,6 +2560,38 @@ int add_new_printer_key( NT_PRINTER_DATA *data, const char *name )
        return key_index;
 }
 
+/****************************************************************************
+ search for a registry key name in the existing printer data
+ ***************************************************************************/
+
+int delete_printer_key( NT_PRINTER_DATA *data, const char *name )
+{
+       int i;
+       NT_PRINTER_KEY *printer_key;
+       
+       for ( i=0; i<data->num_keys; i++ ) {
+               if ( strequal( data->keys[i].name, name ) ) {
+               
+                       /* cleanup memory */
+                       
+                       printer_key = &data->keys[i];
+                       SAFE_FREE( printer_key->name );
+                       regval_ctr_destroy( &printer_key->values );
+                       
+                       /* if not the end of the array, move remaining elements down one slot */
+                       
+                       data->num_keys--;
+                       if ( data->num_keys && (i < data->num_keys) )
+                               memmove( &data->keys[i], &data->keys[i+1], sizeof(NT_PRINTER_KEY)*(data->num_keys-i) );
+                               
+                       break;
+               }
+       }
+       
+
+       return data->num_keys;
+}
+
 /****************************************************************************
  search for a registry key name in the existing printer data
  ***************************************************************************/
index 09a0dd0c34698a7d973c9296839876c20c8fbe4f..60ae68c6665bf15a705f1f3ad2d0b0cd25800699 100644 (file)
@@ -290,8 +290,9 @@ static BOOL key_printers_store_keys( const char *key, REGSUBKEY_CTR *subkeys )
        char *printers_key;
        char *printername, *printerdatakey;
        NT_PRINTER_INFO_LEVEL *printer = NULL;
-       int i, num_subkeys;
+       int i, num_subkeys, num_existing_keys;
        char *subkeyname;
+       fstring *existing_subkeys = NULL;
        
        printers_key = strip_printers_prefix( key );
        
@@ -309,12 +310,29 @@ static BOOL key_printers_store_keys( const char *key, REGSUBKEY_CTR *subkeys )
                        printername));
                return False;
        }
+       
+       /* get the top level printer keys */
+       
+       num_existing_keys = get_printer_subkeys( &printer->info_2->data, "", &existing_subkeys );
+       
+       for ( i=0; i<num_existing_keys; i++ ) {
+       
+               /* remove the key if it has been deleted */
+               
+               if ( !regsubkey_ctr_key_exists( subkeys, existing_subkeys[i] ) ) {
+                       DEBUG(5,("key_printers_store_keys: deleting key %s\n", 
+                               existing_subkeys[i]));
+                       delete_printer_key( &printer->info_2->data, existing_subkeys[i] );
+               }
+       }
 
        num_subkeys = regsubkey_ctr_numkeys( subkeys );
        for ( i=0; i<num_subkeys; i++ ) {
                subkeyname = regsubkey_ctr_specific_key(subkeys, i);
                /* add any missing printer keys */
                if ( lookup_printerkey(&printer->info_2->data, subkeyname) == -1 ) {
+                       DEBUG(5,("key_printers_store_keys: adding key %s\n", 
+                               existing_subkeys[i]));
                        if ( add_new_printer_key( &printer->info_2->data, subkeyname ) == -1 ) 
                                return False;
                }