r3687: Gaah - I forgot to add the new file for the RPC-SAMSYNC test...
[samba.git] / source4 / lib / dcom / common / local.c
1 /*
2    Unix SMB/CIFS implementation.
3    Implementation of some of the local COM calls. Interfaces:
4     - IUnknown
5
6    Copyright (C) 2004 Jelmer Vernooij <jelmer@samba.org>
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23 #include "includes.h"
24 #include "dlinklist.h"
25 #include "librpc/gen_ndr/ndr_dcom.h"
26
27 NTSTATUS dcerpc_IUnknown_AddRef(struct dcom_interface *p, TALLOC_CTX *mem_ctx, struct IUnknown_AddRef *rr) 
28 {
29         struct RemAddRef r;
30         struct REMINTERFACEREF ref;
31         
32         /* This is rather inefficient, but we'll patch it up later */
33         r.in.cInterfaceRefs = 1;
34         r.in.InterfaceRefs = &ref;
35
36         return dcerpc_RemAddRef(p, mem_ctx, &r);
37 }
38
39 NTSTATUS dcerpc_IUnknown_Release(struct dcom_interface *p, TALLOC_CTX *mem_ctx, struct IUnknown_Release *rr)
40 {
41         struct RemRelease r;
42         struct REMINTERFACEREF ref;
43
44         return NT_STATUS_NOT_SUPPORTED;
45         
46         p->private_references--;
47
48         /* Only do the remote version of this call when all local references have 
49          * been released */
50         if (p->private_references == 0) {
51                 NTSTATUS status;
52                 r.in.cInterfaceRefs = 1;
53                 r.in.InterfaceRefs = &ref;
54
55                 status = dcerpc_RemRelease(p, mem_ctx, &r);
56                 
57                 if (NT_STATUS_IS_OK(status)) {
58                         talloc_destroy(p);      
59                 }
60
61                 return status;
62         }
63
64         return NT_STATUS_OK;
65 }
66
67 NTSTATUS dcerpc_IUnknown_QueryInterface(struct dcom_interface *o, TALLOC_CTX *mem_ctx, struct IUnknown_QueryInterface *rr)
68 {
69         /* FIXME: Ask local server for interface pointer. Local server can then 
70          * call RemQueryInterface if necessary */
71         return NT_STATUS_NOT_SUPPORTED;
72 }
73
74 NTSTATUS dcerpc_IClassFactory_CreateInstance(struct dcom_interface *o, TALLOC_CTX *mem_ctx, struct IClassFactory_CreateInstance *rr)
75 {
76         return NT_STATUS_NOT_SUPPORTED;
77 }
78
79 NTSTATUS dcerpc_IClassFactory_LockServer(struct dcom_interface *o, TALLOC_CTX *mem_ctx, struct IClassFactory_LockServer *rr)
80 {
81         return NT_STATUS_NOT_SUPPORTED;
82 }