1706f2543Smrg/*
2706f2543Smrg * Copyright © 2009 Red Hat, Inc.
3706f2543Smrg *
4706f2543Smrg * Permission is hereby granted, free of charge, to any person obtaining a
5706f2543Smrg * copy of this software and associated documentation files (the "Software"),
6706f2543Smrg * to deal in the Software without restriction, including without limitation
7706f2543Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8706f2543Smrg * and/or sell copies of the Software, and to permit persons to whom the
9706f2543Smrg * Software is furnished to do so, subject to the following conditions:
10706f2543Smrg *
11706f2543Smrg * The above copyright notice and this permission notice (including the next
12706f2543Smrg * paragraph) shall be included in all copies or substantial portions of the
13706f2543Smrg * Software.
14706f2543Smrg *
15706f2543Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16706f2543Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17706f2543Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18706f2543Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19706f2543Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20706f2543Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21706f2543Smrg * DEALINGS IN THE SOFTWARE.
22706f2543Smrg *
23706f2543Smrg * Authors: Peter Hutterer
24706f2543Smrg *
25706f2543Smrg */
26706f2543Smrg
27706f2543Smrg/**
28706f2543Smrg * @file xiqueryversion.c
29706f2543Smrg * Protocol handling for the XIQueryVersion request/reply.
30706f2543Smrg */
31706f2543Smrg
32706f2543Smrg#ifdef HAVE_DIX_CONFIG_H
33706f2543Smrg#include <dix-config.h>
34706f2543Smrg#endif
35706f2543Smrg
36706f2543Smrg
37706f2543Smrg#include "inputstr.h"
38706f2543Smrg
39706f2543Smrg#include <X11/Xmd.h>
40706f2543Smrg#include <X11/X.h>
41706f2543Smrg#include <X11/extensions/XI2proto.h>
42706f2543Smrg
43706f2543Smrg#include "exglobals.h"
44706f2543Smrg#include "exevents.h"
45706f2543Smrg#include "xiqueryversion.h"
46706f2543Smrg#include "misc.h"
47706f2543Smrg
48706f2543Smrgextern XExtensionVersion XIVersion; /* defined in getvers.c */
49706f2543Smrg/**
50706f2543Smrg * Return the supported XI version.
51706f2543Smrg *
52706f2543Smrg * Saves the version the client claims to support as well, for future
53706f2543Smrg * reference.
54706f2543Smrg */
55706f2543Smrgint
56706f2543SmrgProcXIQueryVersion(ClientPtr client)
57706f2543Smrg{
58706f2543Smrg    xXIQueryVersionReply rep;
59706f2543Smrg    XIClientPtr pXIClient;
60706f2543Smrg    int major, minor;
61706f2543Smrg    unsigned int sversion, cversion;
62706f2543Smrg
63706f2543Smrg    REQUEST(xXIQueryVersionReq);
64706f2543Smrg    REQUEST_SIZE_MATCH(xXIQueryVersionReq);
65706f2543Smrg
66706f2543Smrg    /* This request only exists after XI2 */
67706f2543Smrg    if (stuff->major_version < 2)
68706f2543Smrg    {
69706f2543Smrg        client->errorValue = stuff->major_version;
70706f2543Smrg        return BadValue;
71706f2543Smrg    }
72706f2543Smrg
73706f2543Smrg    pXIClient = dixLookupPrivate(&client->devPrivates, XIClientPrivateKey);
74706f2543Smrg
75706f2543Smrg    sversion = XIVersion.major_version * 1000 + XIVersion.minor_version;
76706f2543Smrg    cversion = stuff->major_version * 1000 + stuff->minor_version;
77706f2543Smrg
78706f2543Smrg    if (sversion > cversion)
79706f2543Smrg    {
80706f2543Smrg        major = stuff->major_version;
81706f2543Smrg        minor = stuff->minor_version;
82706f2543Smrg    } else
83706f2543Smrg    {
84706f2543Smrg        major = XIVersion.major_version;
85706f2543Smrg        minor = XIVersion.minor_version;
86706f2543Smrg    }
87706f2543Smrg
88706f2543Smrg    pXIClient->major_version = major;
89706f2543Smrg    pXIClient->minor_version = minor;
90706f2543Smrg
91706f2543Smrg    memset(&rep, 0, sizeof(xXIQueryVersionReply));
92706f2543Smrg    rep.repType = X_Reply;
93706f2543Smrg    rep.RepType = X_XIQueryVersion;
94706f2543Smrg    rep.length = 0;
95706f2543Smrg    rep.sequenceNumber = client->sequence;
96706f2543Smrg    rep.major_version = major;
97706f2543Smrg    rep.minor_version = minor;
98706f2543Smrg
99706f2543Smrg    WriteReplyToClient(client, sizeof(xXIQueryVersionReply), &rep);
100706f2543Smrg
101706f2543Smrg    return Success;
102706f2543Smrg}
103706f2543Smrg
104706f2543Smrg/* Swapping routines */
105706f2543Smrg
106706f2543Smrgint
107706f2543SmrgSProcXIQueryVersion(ClientPtr client)
108706f2543Smrg{
109706f2543Smrg    char n;
110706f2543Smrg
111706f2543Smrg    REQUEST(xXIQueryVersionReq);
112706f2543Smrg    swaps(&stuff->length, n);
113706f2543Smrg    REQUEST_AT_LEAST_SIZE(xXIQueryVersionReq);
114706f2543Smrg    swaps(&stuff->major_version, n);
115706f2543Smrg    swaps(&stuff->minor_version, n);
116706f2543Smrg    return (ProcXIQueryVersion(client));
117706f2543Smrg}
118706f2543Smrg
119706f2543Smrgvoid
120706f2543SmrgSRepXIQueryVersion(ClientPtr client, int size, xXIQueryVersionReply *rep)
121706f2543Smrg{
122706f2543Smrg    char n;
123706f2543Smrg    swaps(&rep->sequenceNumber, n);
124706f2543Smrg    swapl(&rep->length, n);
125706f2543Smrg    swaps(&rep->major_version, n);
126706f2543Smrg    swaps(&rep->minor_version, n);
127706f2543Smrg    WriteToClient(client, size, (char *)rep);
128706f2543Smrg}
129