Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
633a5741
Commit
633a5741
authored
Dec 21, 2012
by
Hans Leidekker
Committed by
Alexandre Julliard
Dec 21, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wmiutils: Add a stub implementation of IWbemPath.
parent
d0104974
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
570 additions
and
2 deletions
+570
-2
.gitignore
.gitignore
+1
-0
Makefile.in
dlls/wmiutils/Makefile.in
+1
-0
main.c
dlls/wmiutils/main.c
+7
-0
path.c
dlls/wmiutils/path.c
+363
-0
statuscode.c
dlls/wmiutils/statuscode.c
+0
-2
wmiutils_private.h
dlls/wmiutils/wmiutils_private.h
+1
-0
Makefile.in
include/Makefile.in
+1
-0
wmiutils.idl
include/wmiutils.idl
+196
-0
No files found.
.gitignore
View file @
633a5741
...
...
@@ -259,6 +259,7 @@ include/wine/itss.h
include/wine/svcctl.h
include/wine/winedxgi.h
include/winsxs.h
include/wmiutils.h
include/wmsbuffer.h
include/wmsdkidl.h
include/wpcapi.h
...
...
dlls/wmiutils/Makefile.in
View file @
633a5741
...
...
@@ -3,6 +3,7 @@ IMPORTS = oleaut32 ole32 advapi32
C_SRCS
=
\
main.c
\
path.c
\
statuscode.c
IDL_R_SRCS
=
wmiutils_classes.idl
...
...
dlls/wmiutils/main.c
View file @
633a5741
...
...
@@ -24,8 +24,10 @@
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "initguid.h"
#include "objbase.h"
#include "wbemcli.h"
#include "wmiutils.h"
#include "rpcproxy.h"
#include "wine/debug.h"
...
...
@@ -113,6 +115,7 @@ static const struct IClassFactoryVtbl wmiutils_cf_vtbl =
};
static
wmiutils_cf
status_code_cf
=
{
{
&
wmiutils_cf_vtbl
},
WbemStatusCodeText_create
};
static
wmiutils_cf
path_cf
=
{
{
&
wmiutils_cf_vtbl
},
WbemPath_create
};
BOOL
WINAPI
DllMain
(
HINSTANCE
hinst
,
DWORD
reason
,
LPVOID
lpv
)
{
...
...
@@ -140,6 +143,10 @@ HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv )
{
cf
=
&
status_code_cf
.
IClassFactory_iface
;
}
else
if
(
IsEqualGUID
(
rclsid
,
&
CLSID_WbemDefPath
))
{
cf
=
&
path_cf
.
IClassFactory_iface
;
}
if
(
!
cf
)
return
CLASS_E_CLASSNOTAVAILABLE
;
return
IClassFactory_QueryInterface
(
cf
,
iid
,
ppv
);
}
...
...
dlls/wmiutils/path.c
0 → 100644
View file @
633a5741
/*
* Copyright 2012 Hans Leidekker for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#define COBJMACROS
#include "config.h"
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "ole2.h"
#include "wmiutils.h"
#include "wine/debug.h"
#include "wine/unicode.h"
#include "wmiutils_private.h"
WINE_DEFAULT_DEBUG_CHANNEL
(
wmiutils
);
struct
path
{
IWbemPath
IWbemPath_iface
;
LONG
refs
;
};
static
inline
struct
path
*
impl_from_IWbemPath
(
IWbemPath
*
iface
)
{
return
CONTAINING_RECORD
(
iface
,
struct
path
,
IWbemPath_iface
);
}
static
ULONG
WINAPI
path_AddRef
(
IWbemPath
*
iface
)
{
struct
path
*
path
=
impl_from_IWbemPath
(
iface
);
return
InterlockedIncrement
(
&
path
->
refs
);
}
static
ULONG
WINAPI
path_Release
(
IWbemPath
*
iface
)
{
struct
path
*
path
=
impl_from_IWbemPath
(
iface
);
LONG
refs
=
InterlockedDecrement
(
&
path
->
refs
);
if
(
!
refs
)
{
TRACE
(
"destroying %p
\n
"
,
path
);
HeapFree
(
GetProcessHeap
(),
0
,
path
);
}
return
refs
;
}
static
HRESULT
WINAPI
path_QueryInterface
(
IWbemPath
*
iface
,
REFIID
riid
,
void
**
ppvObject
)
{
struct
path
*
path
=
impl_from_IWbemPath
(
iface
);
TRACE
(
"%p, %s, %p
\n
"
,
path
,
debugstr_guid
(
riid
),
ppvObject
);
if
(
IsEqualGUID
(
riid
,
&
IID_IWbemPath
)
||
IsEqualGUID
(
riid
,
&
IID_IUnknown
)
)
{
*
ppvObject
=
iface
;
}
else
{
FIXME
(
"interface %s not implemented
\n
"
,
debugstr_guid
(
riid
));
return
E_NOINTERFACE
;
}
IWbemPath_AddRef
(
iface
);
return
S_OK
;
}
static
HRESULT
WINAPI
path_SetText
(
IWbemPath
*
iface
,
ULONG
uMode
,
LPCWSTR
pszPath
)
{
FIXME
(
"%p, %u, %s
\n
"
,
iface
,
uMode
,
debugstr_w
(
pszPath
));
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_GetText
(
IWbemPath
*
iface
,
LONG
lFlags
,
ULONG
*
puBufferLength
,
LPWSTR
pszText
)
{
FIXME
(
"%p, 0x%x, %p, %p
\n
"
,
iface
,
lFlags
,
puBufferLength
,
pszText
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_GetInfo
(
IWbemPath
*
iface
,
ULONG
uRequestedInfo
,
ULONGLONG
*
puResponse
)
{
FIXME
(
"%p, %d, %p
\n
"
,
iface
,
uRequestedInfo
,
puResponse
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_SetServer
(
IWbemPath
*
iface
,
LPCWSTR
Name
)
{
FIXME
(
"%p, %s
\n
"
,
iface
,
debugstr_w
(
Name
));
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_GetServer
(
IWbemPath
*
iface
,
ULONG
*
puNameBufLength
,
LPWSTR
pName
)
{
FIXME
(
"%p, %p, %p
\n
"
,
iface
,
puNameBufLength
,
pName
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_GetNamespaceCount
(
IWbemPath
*
iface
,
ULONG
*
puCount
)
{
FIXME
(
"%p, %p
\n
"
,
iface
,
puCount
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_SetNamespaceAt
(
IWbemPath
*
iface
,
ULONG
uIndex
,
LPCWSTR
pszName
)
{
FIXME
(
"%p, %u, %s
\n
"
,
iface
,
uIndex
,
debugstr_w
(
pszName
));
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_GetNamespaceAt
(
IWbemPath
*
iface
,
ULONG
uIndex
,
ULONG
*
puNameBufLength
,
LPWSTR
pName
)
{
FIXME
(
"%p, %u, %p, %p
\n
"
,
iface
,
uIndex
,
puNameBufLength
,
pName
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_RemoveNamespaceAt
(
IWbemPath
*
iface
,
ULONG
uIndex
)
{
FIXME
(
"%p, %u
\n
"
,
iface
,
uIndex
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_RemoveAllNamespaces
(
IWbemPath
*
iface
)
{
FIXME
(
"%p
\n
"
,
iface
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_GetScopeCount
(
IWbemPath
*
iface
,
ULONG
*
puCount
)
{
FIXME
(
"%p, %p
\n
"
,
iface
,
puCount
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_SetScope
(
IWbemPath
*
iface
,
ULONG
uIndex
,
LPWSTR
pszClass
)
{
FIXME
(
"%p, %u, %s
\n
"
,
iface
,
uIndex
,
debugstr_w
(
pszClass
));
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_SetScopeFromText
(
IWbemPath
*
iface
,
ULONG
uIndex
,
LPWSTR
pszText
)
{
FIXME
(
"%p, %u, %s
\n
"
,
iface
,
uIndex
,
debugstr_w
(
pszText
));
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_GetScope
(
IWbemPath
*
iface
,
ULONG
uIndex
,
ULONG
*
puClassNameBufSize
,
LPWSTR
pszClass
,
IWbemPathKeyList
**
pKeyList
)
{
FIXME
(
"%p, %u, %p, %p, %p
\n
"
,
iface
,
uIndex
,
puClassNameBufSize
,
pszClass
,
pKeyList
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_GetScopeAsText
(
IWbemPath
*
iface
,
ULONG
uIndex
,
ULONG
*
puTextBufSize
,
LPWSTR
pszText
)
{
FIXME
(
"%p, %u, %p, %p
\n
"
,
iface
,
uIndex
,
puTextBufSize
,
pszText
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_RemoveScope
(
IWbemPath
*
iface
,
ULONG
uIndex
)
{
FIXME
(
"%p, %u
\n
"
,
iface
,
uIndex
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_RemoveAllScopes
(
IWbemPath
*
iface
)
{
FIXME
(
"%p
\n
"
,
iface
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_SetClassName
(
IWbemPath
*
iface
,
LPCWSTR
Name
)
{
FIXME
(
"%p, %s
\n
"
,
iface
,
debugstr_w
(
Name
));
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_GetClassName
(
IWbemPath
*
iface
,
ULONG
*
puBufferLength
,
LPWSTR
pszName
)
{
FIXME
(
"%p,%p, %p
\n
"
,
iface
,
puBufferLength
,
pszName
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_GetKeyList
(
IWbemPath
*
iface
,
IWbemPathKeyList
**
pOut
)
{
FIXME
(
"%p, %p
\n
"
,
iface
,
pOut
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_CreateClassPart
(
IWbemPath
*
iface
,
LONG
lFlags
,
LPCWSTR
Name
)
{
FIXME
(
"%p, 0x%x, %s
\n
"
,
iface
,
lFlags
,
debugstr_w
(
Name
));
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
path_DeleteClassPart
(
IWbemPath
*
iface
,
LONG
lFlags
)
{
FIXME
(
"%p, 0x%x
\n
"
,
iface
,
lFlags
);
return
E_NOTIMPL
;
}
static
BOOL
WINAPI
path_IsRelative
(
IWbemPath
*
iface
,
LPWSTR
wszMachine
,
LPWSTR
wszNamespace
)
{
FIXME
(
"%p, %s, %s
\n
"
,
iface
,
debugstr_w
(
wszMachine
),
debugstr_w
(
wszNamespace
));
return
E_NOTIMPL
;
}
static
BOOL
WINAPI
path_IsRelativeOrChild
(
IWbemPath
*
iface
,
LPWSTR
wszMachine
,
LPWSTR
wszNamespace
,
LONG
lFlags
)
{
FIXME
(
"%p, %s, %s, 0x%x
\n
"
,
iface
,
debugstr_w
(
wszMachine
),
debugstr_w
(
wszNamespace
),
lFlags
);
return
E_NOTIMPL
;
}
static
BOOL
WINAPI
path_IsLocal
(
IWbemPath
*
iface
,
LPCWSTR
wszMachine
)
{
FIXME
(
"%p, %s
\n
"
,
iface
,
debugstr_w
(
wszMachine
));
return
E_NOTIMPL
;
}
static
BOOL
WINAPI
path_IsSameClassName
(
IWbemPath
*
iface
,
LPCWSTR
wszClass
)
{
FIXME
(
"%p, %s
\n
"
,
iface
,
debugstr_w
(
wszClass
));
return
E_NOTIMPL
;
}
static
const
struct
IWbemPathVtbl
path_vtbl
=
{
path_QueryInterface
,
path_AddRef
,
path_Release
,
path_SetText
,
path_GetText
,
path_GetInfo
,
path_SetServer
,
path_GetServer
,
path_GetNamespaceCount
,
path_SetNamespaceAt
,
path_GetNamespaceAt
,
path_RemoveNamespaceAt
,
path_RemoveAllNamespaces
,
path_GetScopeCount
,
path_SetScope
,
path_SetScopeFromText
,
path_GetScope
,
path_GetScopeAsText
,
path_RemoveScope
,
path_RemoveAllScopes
,
path_SetClassName
,
path_GetClassName
,
path_GetKeyList
,
path_CreateClassPart
,
path_DeleteClassPart
,
path_IsRelative
,
path_IsRelativeOrChild
,
path_IsLocal
,
path_IsSameClassName
};
HRESULT
WbemPath_create
(
IUnknown
*
pUnkOuter
,
LPVOID
*
ppObj
)
{
struct
path
*
path
;
TRACE
(
"%p, %p
\n
"
,
pUnkOuter
,
ppObj
);
if
(
!
(
path
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
*
path
)
)))
return
E_OUTOFMEMORY
;
path
->
IWbemPath_iface
.
lpVtbl
=
&
path_vtbl
;
path
->
refs
=
1
;
*
ppObj
=
&
path
->
IWbemPath_iface
;
TRACE
(
"returning iface %p
\n
"
,
*
ppObj
);
return
S_OK
;
}
dlls/wmiutils/statuscode.c
View file @
633a5741
...
...
@@ -24,8 +24,6 @@
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "initguid.h"
#include "ole2.h"
#include "wbemcli.h"
...
...
dlls/wmiutils/wmiutils_private.h
View file @
633a5741
...
...
@@ -16,4 +16,5 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
HRESULT
WbemPath_create
(
IUnknown
*
,
LPVOID
*
)
DECLSPEC_HIDDEN
;
HRESULT
WbemStatusCodeText_create
(
IUnknown
*
,
LPVOID
*
)
DECLSPEC_HIDDEN
;
include/Makefile.in
View file @
633a5741
...
...
@@ -112,6 +112,7 @@ PUBLIC_IDL_H_SRCS = \
wine/itss.idl
\
wine/svcctl.idl
\
winsxs.idl
\
wmiutils.idl
\
wmsbuffer.idl
\
wmsdkidl.idl
\
wpcapi.idl
\
...
...
include/wmiutils.idl
0 → 100644
View file @
633a5741
/*
*
Copyright
2012
Hans
Leidekker
for
CodeWeavers
*
*
This
library
is
free
software
; you can redistribute it and/or
*
modify
it
under
the
terms
of
the
GNU
Lesser
General
Public
*
License
as
published
by
the
Free
Software
Foundation
; either
*
version
2.1
of
the
License
,
or
(
at
your
option
)
any
later
version
.
*
*
This
library
is
distributed
in
the
hope
that
it
will
be
useful
,
*
but
WITHOUT
ANY
WARRANTY
; without even the implied warranty of
*
MERCHANTABILITY
or
FITNESS
FOR
A
PARTICULAR
PURPOSE
.
See
the
GNU
*
Lesser
General
Public
License
for
more
details
.
*
*
You
should
have
received
a
copy
of
the
GNU
Lesser
General
Public
*
License
along
with
this
library
; if not, write to the Free Software
*
Foundation
,
Inc
.
,
51
Franklin
St
,
Fifth
Floor
,
Boston
,
MA
02110
-
1301
,
USA
*/
import
"oaidl.idl"
;
interface
IWbemPath
;
interface
IWbemPathKeyList
;
[
local
,
object
,
uuid
(
9
ae62877
-
7544
-
4b
b0
-
aa26
-
a13824659ed6
)
]
interface
IWbemPathKeyList
:
IUnknown
{
HRESULT
GetCount
(
[
out
]
ULONG
*
puKeyCount
)
;
HRESULT
SetKey
(
[
in
,
string
]
LPCWSTR
wszName
,
[
in
]
ULONG
uFlags
,
[
in
]
ULONG
uCimType
,
[
in
]
LPVOID
pKeyVal
)
;
HRESULT
SetKey2
(
[
in
,
string
]
LPCWSTR
wszName
,
[
in
]
ULONG
uFlags
,
[
in
]
ULONG
uCimType
,
[
in
]
VARIANT
*
pKeyVal
)
;
HRESULT
GetKey
(
[
in
]
ULONG
uKeyIx
,
[
in
]
ULONG
uFlags
,
[
in
,
out
]
ULONG
*
puNameBufSize
,
[
in
,
out
]
LPWSTR
pszKeyName
,
[
in
,
out
]
ULONG
*
puKeyValBufSize
,
[
in
,
out
]
LPVOID
pKeyVal
,
[
out
]
ULONG
*
puApparentCimType
)
;
HRESULT
GetKey2
(
[
in
]
ULONG
uKeyIx
,
[
in
]
ULONG
uFlags
,
[
in
,
out
]
ULONG
*
puNameBufSize
,
[
in
,
out
]
LPWSTR
pszKeyName
,
[
in
,
out
]
VARIANT
*
pKeyValue
,
[
out
]
ULONG
*
puApparentCimType
)
;
HRESULT
RemoveKey
(
[
in
,
string
]
LPCWSTR
wszName
,
[
in
]
ULONG
uFlags
)
;
HRESULT
RemoveAllKeys
(
[
in
]
ULONG
uFlags
)
;
HRESULT
MakeSingleton
(
[
in
]
boolean
bSet
)
;
HRESULT
GetInfo
(
[
in
]
ULONG
uRequestedInfo
,
[
out
]
ULONGLONG
*
puResponse
)
;
HRESULT
GetText
(
[
in
]
long
lFlags
,
[
in
,
out
]
ULONG
*
puBuffLength
,
[
in
,
out
,
string
]
LPWSTR
pszText
)
;
}
;
cpp_quote
(
"#ifdef WINE_NO_UNICODE_MACROS"
)
cpp_quote
(
"#undef GetClassName"
)
cpp_quote
(
"#endif"
)
[
local
,
object
,
uuid
(
3b
c15af2
-
736
c
-477e-9
e51
-
238
af8667dcc
)
]
interface
IWbemPath
:
IUnknown
{
HRESULT
SetText
(
[
in
]
ULONG
uMode
,
[
in
]
LPCWSTR
pszPath
)
;
HRESULT
GetText
(
[
in
]
long
lFlags
,
[
in
,
out
]
ULONG
*
puBuffLength
,
[
in
,
out
,
string
]
LPWSTR
pszText
)
;
HRESULT
GetInfo
(
[
in
]
ULONG
uRequestedInfo
,
[
out
]
ULONGLONG
*
puResponse
)
;
HRESULT
SetServer
(
[
in
,
string
]
LPCWSTR
Name
)
;
HRESULT
GetServer
(
[
in
,
out
]
ULONG
*
puNameBufLength
,
[
in
,
out
,
string
]
LPWSTR
pName
)
;
HRESULT
GetNamespaceCount
(
[
out
]
ULONG
*
puCount
)
;
HRESULT
SetNamespaceAt
(
[
in
]
ULONG
uIndex
,
[
in
,
string
]
LPCWSTR
pszName
)
;
HRESULT
GetNamespaceAt
(
[
in
]
ULONG
uIndex
,
[
in
,
out
]
ULONG
*
puNameBufLength
,
[
in
,
out
,
string
]
LPWSTR
pName
)
;
HRESULT
RemoveNamespaceAt
(
[
in
]
ULONG
uIndex
)
;
HRESULT
RemoveAllNamespaces
()
;
HRESULT
GetScopeCount
(
[
out
]
ULONG
*
puCount
)
;
HRESULT
SetScope
(
[
in
]
ULONG
uIndex
,
[
in
]
LPWSTR
pszClass
)
;
HRESULT
SetScopeFromText
(
[
in
]
ULONG
uIndex
,
[
in
]
LPWSTR
pszText
)
;
HRESULT
GetScope
(
[
in
]
ULONG
uIndex
,
[
in
,
out
]
ULONG
*
puClassNameBufSize
,
[
in
,
out
]
LPWSTR
pszClass
,
[
out
]
IWbemPathKeyList
**
pKeyList
)
;
HRESULT
GetScopeAsText
(
[
in
]
ULONG
uIndex
,
[
in
,
out
]
ULONG
*
puTextBufSize
,
[
in
,
out
]
LPWSTR
pszText
)
;
HRESULT
RemoveScope
(
[
in
]
ULONG
uIndex
)
;
HRESULT
RemoveAllScopes
()
;
HRESULT
SetClassName
(
[
in
,
string
]
LPCWSTR
Name
)
;
HRESULT
GetClassName
(
[
in
,
out
]
ULONG
*
puBuffLength
,
[
in
,
out
,
string
]
LPWSTR
pszName
)
;
HRESULT
GetKeyList
(
[
out
]
IWbemPathKeyList
**
pOut
)
;
HRESULT
CreateClassPart
(
[
in
]
long
lFlags
,
[
in
,
string
]
LPCWSTR
Name
)
;
HRESULT
DeleteClassPart
(
[
in
]
long
lFlags
)
;
BOOL
IsRelative
(
[
in
,
string
]
LPWSTR
wszMachine
,
[
in
,
string
]
LPWSTR
wszNamespace
)
;
BOOL
IsRelativeOrChild
(
[
in
,
string
]
LPWSTR
wszMachine
,
[
in
,
string
]
LPWSTR
wszNamespace
,
[
in
]
long
lFlags
)
;
BOOL
IsLocal
(
[
in
,
string
]
LPCWSTR
wszMachine
)
;
BOOL
IsSameClassName
(
[
in
,
string
]
LPCWSTR
wszClass
)
;
}
;
[
uuid
(
cf4cc405
-
e2c5
-
4
ddd
-
b3ce
-
5
e7582d8c9fa
)
]
coclass
WbemDefPath
{
interface
IWbemPath
;
}
;
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment