00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 #ifndef UPNP_H
00054 #define UPNP_H
00055
00059
00060 #include <stdio.h>
00061 #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__NetBSD__)
00062 #include <time.h>
00063 #include <sys/types.h>
00064 #endif
00065 #include "ixml.h"
00066 #include "upnpconfig.h"
00067 #if UPNP_HAVE_DEBUG
00068 # include "upnpdebug.h"
00069 #endif
00070
00071 #ifdef WIN32
00072 #ifndef UPNP_STATIC_LIB
00073 #ifdef LIBUPNP_EXPORTS
00074
00075 #define EXPORT_SPEC __declspec(dllexport)
00076 #else
00077 #define EXPORT_SPEC __declspec(dllimport)
00078 #endif
00079 #else
00080 #define EXPORT_SPEC
00081 #endif
00082 #else
00083 #define EXPORT_SPEC
00084 #endif
00085
00086 #ifndef WIN32
00087 #define UpnpCloseSocket close
00088 #else
00089 #define UpnpCloseSocket closesocket
00090 #endif
00091 #define UPNP_SOCKETERROR -1
00092 #define UPNP_INVALID_SOCKET -1
00093 #ifndef WIN32
00094 #define SOCKET int
00095 #endif
00096
00097 #ifndef WIN32
00098 #include <netinet/in.h>
00099 #else
00100 #include <winsock2.h>
00101 #include <time.h>
00102 #endif
00103
00104 #define NUM_HANDLE 200
00105 #define LINE_SIZE 180
00106 #define NAME_SIZE 256
00107 #define HEADER_SIZE 256
00108 #define MNFT_NAME_SIZE 64
00109 #define MODL_NAME_SIZE 32
00110 #define SERL_NUMR_SIZE 64
00111 #define MODL_DESC_SIZE 64
00112 #define UPNP_INFINITE -1
00113
00114 #define UPNP_USING_CHUNKED -3
00115 #define UPNP_UNTIL_CLOSE -4
00116
00117
00126
00134 #define UPNP_E_SUCCESS 0
00135
00136
00142 #define UPNP_E_INVALID_HANDLE -100
00143
00144
00151 #define UPNP_E_INVALID_PARAM -101
00152
00153
00160 #define UPNP_E_OUTOF_HANDLE -102
00161
00162
00163 #define UPNP_E_OUTOF_CONTEXT -103
00164
00171 #define UPNP_E_OUTOF_MEMORY -104
00172
00173
00181 #define UPNP_E_INIT -105
00182
00183
00184 #define UPNP_E_BUFFER_TOO_SMALL -106
00185
00192 #define UPNP_E_INVALID_DESC -107
00193
00194
00202 #define UPNP_E_INVALID_URL -108
00203
00204
00205 #define UPNP_E_INVALID_SID -109
00206 #define UPNP_E_INVALID_DEVICE -110
00207
00215 #define UPNP_E_INVALID_SERVICE -111
00216
00217
00224 #define UPNP_E_BAD_RESPONSE -113
00225
00226
00227 #define UPNP_E_BAD_REQUEST -114
00228
00235 #define UPNP_E_INVALID_ACTION -115
00236
00237
00244 #define UPNP_E_FINISH -116
00245
00246
00252 #define UPNP_E_INIT_FAILED -117
00253
00254
00259 #define UPNP_E_URL_TOO_BIG -118
00260
00270 #define UPNP_E_BAD_HTTPMSG -119
00271
00272
00279 #define UPNP_E_ALREADY_REGISTERED -120
00280
00281
00290 #define UPNP_E_NETWORK_ERROR -200
00291
00292
00301 #define UPNP_E_SOCKET_WRITE -201
00302
00303
00312 #define UPNP_E_SOCKET_READ -202
00313
00314
00324 #define UPNP_E_SOCKET_BIND -203
00325
00326
00336 #define UPNP_E_SOCKET_CONNECT -204
00337
00338
00348 #define UPNP_E_OUTOF_SOCKET -205
00349
00350
00357 #define UPNP_E_LISTEN -206
00358
00359
00366 #define UPNP_E_TIMEDOUT -207
00367
00368
00375 #define UPNP_E_SOCKET_ERROR -208
00376
00377
00378 #define UPNP_E_FILE_WRITE_ERROR -209
00379
00386 #define UPNP_E_CANCELED -210
00387
00388
00389 #define UPNP_E_EVENT_PROTOCOL -300
00390
00396 #define UPNP_E_SUBSCRIBE_UNACCEPTED -301
00397
00398
00404 #define UPNP_E_UNSUBSCRIBE_UNACCEPTED -302
00405
00406
00412 #define UPNP_E_NOTIFY_UNACCEPTED -303
00413
00414
00421 #define UPNP_E_INVALID_ARGUMENT -501
00422
00423
00430 #define UPNP_E_FILE_NOT_FOUND -502
00431
00432
00437 #define UPNP_E_FILE_READ_ERROR -503
00438
00439
00445 #define UPNP_E_EXT_NOT_XML -504
00446
00447
00448 #define UPNP_E_NO_WEB_SERVER -505
00449 #define UPNP_E_OUTOF_BOUNDS -506
00450
00456 #define UPNP_E_NOT_FOUND -507
00457
00458
00464 #define UPNP_E_INTERNAL_ERROR -911
00465
00466
00467
00468 #define UPNP_SOAP_E_INVALID_ACTION 401
00469 #define UPNP_SOAP_E_INVALID_ARGS 402
00470 #define UPNP_SOAP_E_OUT_OF_SYNC 403
00471 #define UPNP_SOAP_E_INVALID_VAR 404
00472 #define UPNP_SOAP_E_ACTION_FAILED 501
00473
00474
00475 #ifndef OUT
00476 #define OUT
00477 #endif
00478
00479 #ifndef IN
00480 #define IN
00481 #endif
00482
00483 #ifndef INOUT
00484 #define INOUT
00485 #endif
00486
00487 enum UpnpOpenFileMode{UPNP_READ, UPNP_WRITE};
00488
00490
00491
00496 typedef int UpnpClient_Handle;
00497
00502 typedef int UpnpDevice_Handle;
00503
00511 enum Upnp_EventType_e {
00512
00513
00514
00515
00516
00522 UPNP_CONTROL_ACTION_REQUEST,
00523
00528 UPNP_CONTROL_ACTION_COMPLETE,
00529
00535 UPNP_CONTROL_GET_VAR_REQUEST,
00536
00541 UPNP_CONTROL_GET_VAR_COMPLETE,
00542
00543
00544
00545
00546
00552 UPNP_DISCOVERY_ADVERTISEMENT_ALIVE,
00553
00559 UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE,
00560
00566 UPNP_DISCOVERY_SEARCH_RESULT,
00567
00572 UPNP_DISCOVERY_SEARCH_TIMEOUT,
00573
00574
00575
00576
00577
00588 UPNP_EVENT_SUBSCRIPTION_REQUEST,
00589
00594 UPNP_EVENT_RECEIVED,
00595
00600 UPNP_EVENT_RENEWAL_COMPLETE,
00601
00606 UPNP_EVENT_SUBSCRIBE_COMPLETE,
00607
00612 UPNP_EVENT_UNSUBSCRIBE_COMPLETE,
00613
00619 UPNP_EVENT_AUTORENEWAL_FAILED,
00620
00626 UPNP_EVENT_SUBSCRIPTION_EXPIRED
00627
00628 };
00629
00630 typedef enum Upnp_EventType_e Upnp_EventType;
00631
00637 typedef char Upnp_SID[44];
00638
00648 enum Upnp_SType_e {
00649
00651 UPNP_S_ALL,
00652
00654 UPNP_S_ROOT,
00655
00658 UPNP_S_DEVICE,
00659
00662 UPNP_S_SERVICE
00663
00664 };
00665
00666 typedef enum Upnp_SType_e Upnp_SType;
00667
00674 enum Upnp_DescType_e {
00675
00677 UPNPREG_URL_DESC,
00678
00681 UPNPREG_FILENAME_DESC,
00682
00685 UPNPREG_BUF_DESC
00686
00687 };
00688
00689 typedef enum Upnp_DescType_e Upnp_DescType;
00690
00693 struct Upnp_Action_Request
00694 {
00696 int ErrCode;
00697
00699 int Socket;
00700
00702 char ErrStr[LINE_SIZE];
00703
00705 char ActionName[NAME_SIZE];
00706
00708 char DevUDN[NAME_SIZE];
00709
00711 char ServiceID[NAME_SIZE];
00712
00714 IXML_Document *ActionRequest;
00715
00717 IXML_Document *ActionResult;
00718
00720 struct in_addr CtrlPtIPAddr;
00721
00724 IXML_Document *SoapHeader;
00725 };
00726
00727 struct Upnp_Action_Complete
00728 {
00730 int ErrCode;
00731
00733 char CtrlUrl[NAME_SIZE];
00734
00736 IXML_Document *ActionRequest;
00737
00739 IXML_Document *ActionResult;
00740
00741 };
00742
00746 struct Upnp_State_Var_Request
00747 {
00749 int ErrCode;
00750
00752 int Socket;
00753
00755 char ErrStr[LINE_SIZE];
00756
00758 char DevUDN[NAME_SIZE];
00759
00761 char ServiceID[NAME_SIZE];
00762
00764 char StateVarName[NAME_SIZE];
00765
00767 struct in_addr CtrlPtIPAddr;
00768
00771 DOMString CurrentVal;
00772 };
00773
00777 struct Upnp_State_Var_Complete
00778 {
00780 int ErrCode;
00781
00783 char CtrlUrl[NAME_SIZE];
00784
00786 char StateVarName[NAME_SIZE];
00787
00789 DOMString CurrentVal;
00790 };
00791
00794 struct Upnp_Event
00795 {
00797 Upnp_SID Sid;
00798
00800 int EventKey;
00801
00803 IXML_Document *ChangedVariables;
00804
00805 };
00806
00807
00808
00809
00810
00811
00812 typedef struct sockaddr_in SOCKADDRIN;
00813
00816 struct Upnp_Discovery
00817 {
00818
00820 int ErrCode;
00821
00823 int Expires;
00824
00826 char DeviceId[LINE_SIZE];
00827
00829 char DeviceType[LINE_SIZE];
00830
00832 char ServiceType[LINE_SIZE];
00833
00835 char ServiceVer[LINE_SIZE];
00836
00838 char Location[LINE_SIZE];
00839
00841 char Os[LINE_SIZE];
00842
00844 char Date[LINE_SIZE];
00845
00847 char Ext[LINE_SIZE];
00848
00850 SOCKADDRIN * DestAddr;
00851
00852 };
00853
00857 struct Upnp_Event_Subscribe {
00858
00865 Upnp_SID Sid;
00866
00868 int ErrCode;
00869
00871 char PublisherUrl[NAME_SIZE];
00872
00874 int TimeOut;
00875
00876 };
00877
00881 struct Upnp_Subscription_Request
00882 {
00884 char *ServiceId;
00885
00887 char *UDN;
00888
00890 Upnp_SID Sid;
00891
00892 };
00893
00894
00895 struct File_Info
00896 {
00900 off_t file_length;
00901
00904 time_t last_modified;
00905
00908 int is_directory;
00909
00912 int is_readable;
00913
00916 int force_chunked;
00917
00921 DOMString content_type;
00922
00927 DOMString http_header;
00928
00929 };
00930
00931
00932
00933 typedef void *UpnpWebFileHandle;
00934
00939 struct UpnpVirtualDirCallbacks
00940 {
00943 int (*get_info) (
00944 IN const char *filename,
00945 OUT struct File_Info *info
00947 );
00948
00952 UpnpWebFileHandle (*open)(
00953 IN const char *filename,
00954 OUT struct File_Info *info,
00956 IN enum UpnpOpenFileMode Mode
00959 );
00960
00972 int (*read) (
00973 IN UpnpWebFileHandle fileHnd,
00974 OUT char *buf,
00976 IN size_t buflen
00978 );
00979
00985 int (*write) (
00986 IN UpnpWebFileHandle fileHnd,
00987 IN char *buf,
00988 IN size_t buflen
00989 );
00990
01002 int (*seek) (
01003 IN UpnpWebFileHandle fileHnd,
01005 IN off_t offset,
01010 IN int origin
01017 );
01018
01023 int (*close) (
01024 IN UpnpWebFileHandle fileHnd
01025 );
01026
01027 };
01028
01029 typedef struct virtual_Dir_List
01030 {
01031 struct virtual_Dir_List *next;
01032 char dirName[NAME_SIZE];
01033 } virtualDirList;
01034
01035 typedef struct user_HTTP_Header_List
01036 {
01037 struct user_HTTP_Header_List *next;
01038 char header[HEADER_SIZE];
01039 } userHTTPHeaderList;
01040
01041
01067 typedef int (*Upnp_FunPtr) (
01068 IN Upnp_EventType EventType,
01069 IN void *Event,
01070 IN void *Cookie
01071 );
01072
01074
01075 #ifdef __cplusplus
01076 extern "C" {
01077 #endif // __cplusplus
01078
01080
01081
01111 EXPORT_SPEC int UpnpInit(
01112 IN const char *HostIP,
01116 IN unsigned short DestPort,
01118 IN int maxHTTPTimeoutRetries,
01121 IN void *thread_cleanup
01126 );
01127
01139 EXPORT_SPEC int UpnpFinish();
01140
01149 EXPORT_SPEC unsigned short UpnpGetServerPort(void);
01150
01159 EXPORT_SPEC char * UpnpGetServerIpAddress(void);
01160
01180 EXPORT_SPEC int UpnpRegisterClient(
01181 IN Upnp_FunPtr Callback,
01183 IN const void *Cookie,
01185 OUT UpnpClient_Handle *Hnd
01187 );
01188
01224 EXPORT_SPEC int UpnpRegisterRootDevice(
01225 IN const char *DescUrl,
01228 IN Upnp_FunPtr Callback,
01230 IN const void *Cookie,
01232 OUT UpnpDevice_Handle *Hnd
01234 );
01235
01303 EXPORT_SPEC int UpnpRegisterRootDevice2(
01304 IN Upnp_DescType descriptionType,
01306 IN const char* description,
01309 IN size_t bufferLen,
01312 IN int config_baseURL,
01317 IN Upnp_FunPtr Fun,
01320 IN const void* Cookie,
01323 OUT UpnpDevice_Handle* Hnd
01325 );
01326
01342 EXPORT_SPEC int UpnpUnRegisterClient(
01343 IN UpnpClient_Handle Hnd
01345 );
01346
01365 EXPORT_SPEC int UpnpUnRegisterRootDevice(
01366 IN UpnpDevice_Handle
01368 );
01369
01370
01376 EXPORT_SPEC int UpnpSetContentLength(
01377 IN UpnpClient_Handle Hnd,
01378 IN int contentLength
01379 );
01380
01381
01394 EXPORT_SPEC int UpnpSetMaxContentLength(
01395 IN size_t contentLength
01397 );
01398
01400
01403
01404
01405
01408
01410
01411
01432 EXPORT_SPEC int UpnpSearchAsync(
01433 IN UpnpClient_Handle Hnd,
01435 IN int Mx,
01441 IN const char *Target,
01443 IN const void *Cookie
01445 );
01446
01462 EXPORT_SPEC int UpnpSendAdvertisement(
01463 IN UpnpDevice_Handle Hnd,
01465 IN int Exp
01467 );
01468
01470
01473
01474
01475
01478
01480
01481
01505 EXPORT_SPEC int UpnpGetServiceVarStatus(
01506 IN UpnpClient_Handle Hnd,
01507 IN const char *ActionURL,
01508 IN const char *VarName,
01509 OUT DOMString *StVarVal
01514 );
01515
01533 EXPORT_SPEC int UpnpGetServiceVarStatusAsync(
01534 IN UpnpClient_Handle Hnd,
01535 IN const char *ActionURL,
01536 IN const char *VarName,
01537 IN Upnp_FunPtr Fun,
01539 IN const void *Cookie
01541 );
01542
01568 EXPORT_SPEC int UpnpSendAction(
01569 IN UpnpClient_Handle Hnd,
01571 IN const char *ActionURL,
01572 IN const char *ServiceType,
01573 IN const char *DevUDN,
01575 IN IXML_Document *Action,
01576 OUT IXML_Document **RespNode
01580 );
01581
01607 EXPORT_SPEC int UpnpSendActionEx(
01608 IN UpnpClient_Handle Hnd,
01610 IN const char *ActionURL,
01611 IN const char *ServiceType,
01612 IN const char *DevUDN,
01614 IN IXML_Document *Header,
01617 IN IXML_Document *Action,
01618 OUT IXML_Document **RespNode
01622 );
01623
01646 EXPORT_SPEC int UpnpSendActionAsync(
01647 IN UpnpClient_Handle Hnd,
01649 IN const char *ActionURL,
01650 IN const char *ServiceType,
01651 IN const char *DevUDN,
01653 IN IXML_Document *Action,
01655 IN Upnp_FunPtr Fun,
01658 IN const void *Cookie
01660 );
01661
01684 EXPORT_SPEC int UpnpSendActionExAsync(
01685 IN UpnpClient_Handle Hnd,
01687 IN const char *ActionURL,
01688 IN const char *ServiceType,
01689 IN const char *DevUDN,
01691 IN IXML_Document *Header,
01694 IN IXML_Document *Action,
01696 IN Upnp_FunPtr Fun,
01699 IN const void *Cookie
01701 );
01702
01704
01707
01708
01709
01712
01714
01715
01742 EXPORT_SPEC int UpnpAcceptSubscription(
01743 IN UpnpDevice_Handle Hnd,
01744 IN const char *DevID,
01746 IN const char *ServID,
01748 IN const char **VarName,
01749 IN const char **NewVal,
01751 IN int cVariables,
01753 IN Upnp_SID SubsId
01755 );
01756
01782 EXPORT_SPEC int UpnpAcceptSubscriptionExt(
01783 IN UpnpDevice_Handle Hnd,
01784 IN const char *DevID,
01786 IN const char *ServID,
01788 IN IXML_Document *PropSet,
01793 IN Upnp_SID SubsId
01795 );
01796
01819 EXPORT_SPEC int UpnpNotify(
01820 IN UpnpDevice_Handle,
01821 IN const char *DevID,
01823 IN const char *ServID,
01825 IN const char **VarName,
01827 IN const char **NewVal,
01829 IN int cVariables
01831 );
01832
01855 EXPORT_SPEC int UpnpNotifyExt(
01856 IN UpnpDevice_Handle,
01858 IN const char *DevID,
01860 IN const char *ServID,
01862 IN IXML_Document *PropSet
01867 );
01868
01898 EXPORT_SPEC int UpnpRenewSubscription(
01899 IN UpnpClient_Handle Hnd,
01901 INOUT int *TimeOut,
01904 IN Upnp_SID SubsId
01905 );
01906
01956 EXPORT_SPEC int UpnpRenewSubscriptionAsync(
01957 IN UpnpClient_Handle Hnd,
01959 IN int TimeOut,
01962 IN Upnp_SID SubsId,
01963 IN Upnp_FunPtr Fun,
01965 IN const void *Cookie
01967 );
01968
01984 EXPORT_SPEC int UpnpSetMaxSubscriptions(
01985 IN UpnpDevice_Handle Hnd,
01988 IN int MaxSubscriptions
01990 );
01991
02007 EXPORT_SPEC int UpnpSetMaxSubscriptionTimeOut(
02008 IN UpnpDevice_Handle Hnd,
02011 IN int MaxSubscriptionTimeOut
02013 );
02014
02044 EXPORT_SPEC int UpnpSubscribe(
02045 IN UpnpClient_Handle Hnd,
02046 IN const char *PublisherUrl,
02047 INOUT int *TimeOut,
02052 OUT Upnp_SID SubsId
02054 );
02055
02106 EXPORT_SPEC int UpnpSubscribeAsync(
02107 IN UpnpClient_Handle Hnd,
02109 IN const char *PublisherUrl,
02111 IN int TimeOut,
02115 IN Upnp_FunPtr Fun,
02117 IN const void *Cookie
02119 );
02120
02151 EXPORT_SPEC int UpnpUnSubscribe(
02152 IN UpnpClient_Handle Hnd,
02154 IN Upnp_SID SubsId
02156 );
02157
02206 EXPORT_SPEC int UpnpUnSubscribeAsync(
02207 IN UpnpClient_Handle Hnd,
02209 IN Upnp_SID SubsId,
02211 IN Upnp_FunPtr Fun,
02213 IN const void *Cookie
02215 );
02216
02218
02219
02222
02223
02224
02227
02229
02230
02259 EXPORT_SPEC int UpnpDownloadUrlItem(
02260 IN const char *url,
02261 OUT char **outBuf,
02262 OUT char *contentType
02265 );
02266
02296 EXPORT_SPEC int UpnpOpenHttpGet(
02297 IN const char *url,
02298 IN OUT void **handle,
02300 IN OUT char **contentType,
02302 IN OUT off_t *contentLength,
02304 IN OUT int *httpStatus,
02306 IN int timeout
02311 );
02312
02343 EXPORT_SPEC int UpnpOpenHttpGetProxy(
02344 IN const char *url,
02345 IN const char *proxy_str,
02346 IN OUT void **handle,
02348 IN OUT char **contentType,
02350 IN OUT off_t *contentLength,
02352 IN OUT int *httpStatus,
02354 IN int timeout
02359 );
02360
02392 EXPORT_SPEC int UpnpOpenHttpGetEx(
02393 IN const char *url,
02394 IN OUT void **handle,
02396 IN OUT char **contentType,
02398 IN OUT off_t *contentLength,
02400 IN OUT int *httpStatus,
02403 IN int lowRange,
02405 IN int highRange,
02407 IN int timeout
02411 );
02412
02433 EXPORT_SPEC int UpnpReadHttpGet(
02434 IN void *handle,
02436 IN OUT char *buf,
02437 IN OUT off_t *size,
02438 IN int timeout
02443 );
02444
02456 EXPORT_SPEC int UpnpHttpGetProgress(
02457 IN void *handle,
02459 OUT off_t *length,
02460 OUT off_t *total
02461 );
02462
02463
02474 EXPORT_SPEC int UpnpCancelHttpGet(IN void *handle);
02475
02486 EXPORT_SPEC int UpnpCloseHttpGet(IN void *handle);
02487
02488
02515 EXPORT_SPEC int UpnpOpenHttpPost(
02516 IN const char *url,
02518 IN OUT void **handle,
02522 IN const char *contentType,
02524 IN int contentLength,
02526 IN int timeout
02530 );
02531
02532
02548 EXPORT_SPEC int UpnpWriteHttpPost(
02549 IN void *handle,
02551 IN char *buf,
02552 IN off_t *size,
02553 IN int timeout
02557 );
02558
02575 EXPORT_SPEC int UpnpCloseHttpPost(
02576 IN void *handle,
02579 IN OUT int *httpStatus,
02581 IN int timeout
02585 );
02586
02587
02616 EXPORT_SPEC int UpnpDownloadXmlDoc(
02617 IN const char *url,
02618 OUT IXML_Document **xmlDoc
02620 );
02621
02623
02626
02627
02628
02631
02633
02634
02654 EXPORT_SPEC int UpnpSetWebServerRootDir(
02655 IN const char* rootDir
02657 );
02658
02670 EXPORT_SPEC int UpnpAddCustomHTTPHeader(
02671 IN const char* header_string
02672 );
02673
02684 EXPORT_SPEC int UpnpRemoveCustomHTTPHeader(
02685 IN const char* header_string
02686 );
02687
02694 EXPORT_SPEC void UpnpRemoveAllCustomHTTPHeaders( );
02695
02696
02709 EXPORT_SPEC int UpnpSetVirtualDirCallbacks(
02710 IN struct UpnpVirtualDirCallbacks *callbacks
02714 );
02715
02726 EXPORT_SPEC int UpnpEnableWebserver(
02727 IN int enable
02728 );
02729
02740 EXPORT_SPEC int UpnpIsWebserverEnabled();
02741
02755 EXPORT_SPEC int UpnpAddVirtualDir(
02756 IN const char *dirName
02758 );
02759
02770 EXPORT_SPEC int UpnpRemoveVirtualDir(
02771 IN const char *dirName
02773 );
02774
02781 EXPORT_SPEC void UpnpRemoveAllVirtualDirs( );
02782
02783 EXPORT_SPEC void UpnpFree(
02784 IN void *item
02785 );
02786
02788
02789 #ifdef __cplusplus
02790 }
02791 #endif // __cplusplus
02792
02794
02795 #endif