Caller must free.
****************************************************************************/
-static NT_PRINTER_INFO_LEVEL_2* dup_printer_2( TALLOC_CTX *ctx, NT_PRINTER_INFO_LEVEL_2 *printer )
+NT_PRINTER_INFO_LEVEL_2* dup_printer_2( TALLOC_CTX *ctx, NT_PRINTER_INFO_LEVEL_2 *printer )
{
NT_PRINTER_INFO_LEVEL_2 *copy;
Get a NT_PRINTER_INFO_LEVEL struct. It returns malloced memory.
****************************************************************************/
-#define ENABLE_PRINT_HND_CACHE 1
-
WERROR get_a_printer( Printer_entry *print_hnd, NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level,
const char *sharename)
{
* is actually for a printer and that the printer_info pointer
* is valid
*/
-#ifdef ENABLE_PRINT_HND_CACHE /* JERRY */
if ( print_hnd
&& (print_hnd->printer_type==PRINTER_HANDLE_IS_PRINTER)
&& print_hnd->printer_info )
break;
}
-#endif
- /* no cache; look it up on disk */
+ /* no cache for this handle; see if we can match one from another handle */
- result=get_a_printer_2(&printer->info_2, sharename);
- if (W_ERROR_IS_OK(result)) {
- dump_a_printer(*printer, level);
+ if ( print_hnd )
+ result = find_printer_in_print_hnd_cache(print_hnd->ctx, &printer->info_2, sharename);
+
+ /* fail to disk if we don't have it with any open handle */
-#if ENABLE_PRINT_HND_CACHE /* JERRY */
+ if ( !print_hnd || !W_ERROR_IS_OK(result) )
+ result = get_a_printer_2(&printer->info_2, sharename);
+
+ /* we have a new printer now. Save it with this handle */
+
+ if ( W_ERROR_IS_OK(result) ) {
+ dump_a_printer(*printer, level);
+
/* save a copy in cache */
if ( print_hnd && (print_hnd->printer_type==PRINTER_HANDLE_IS_PRINTER)) {
if ( !print_hnd->printer_info )
print_hnd->printer_info = (NT_PRINTER_INFO_LEVEL *)malloc(sizeof(NT_PRINTER_INFO_LEVEL));
-
+
if ( print_hnd->printer_info ) {
print_hnd->printer_info->info_2 = dup_printer_2(print_hnd->ctx, printer->info_2);
if ( !print_hnd->printer_info->info_2 )
DEBUG(0,("get_a_printer: unable to copy new printer info!\n"));
}
-
}
-#endif
- *pp_printer = printer;
+ *pp_printer = printer;
}
- else
+ else
SAFE_FREE(printer);
-
-
+
break;
+
default:
result=WERR_UNKNOWN_LEVEL;
break;
}
/****************************************************************************
- find printer index by handle
+ look for a printer object cached on an open printer handle
+****************************************************************************/
+
+WERROR find_printer_in_print_hnd_cache( TALLOC_CTX *ctx, NT_PRINTER_INFO_LEVEL_2 **info2,
+ const char *printername )
+{
+ Printer_entry *p;
+
+ DEBUG(10,("find_printer_in_print_hnd_cache: printer [%s]\n", printername));
+
+ for ( p=printers_list; p; p=p->next )
+ {
+ if ( p->printer_type==PRINTER_HANDLE_IS_PRINTER
+ && p->printer_info
+ && StrCaseCmp(p->dev.handlename, printername) == 0 )
+ {
+ DEBUG(10,("Found printer\n"));
+ *info2 = dup_printer_2( ctx, p->printer_info->info_2 );
+ if ( *info2 )
+ return WERR_OK;
+ }
+ }
+
+ return WERR_INVALID_PRINTER_NAME;
+}
+
+/****************************************************************************
+ destroy any cached printer_info_2 structures on open handles
****************************************************************************/
void invalidate_printer_hnd_cache( char *printername )