/*
 * camsession.h - GStreamer CAM (EN50221) Session Layer
 * Copyright (C) 2007 Alessandro Decina
 *
 * Authors:
 *   Alessandro Decina <alessandro@nnva.org>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 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
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library 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.
 */

#ifndef CAM_SESSION_H
#define CAM_SESSION_H

#include "cam.h"
#include "camtransport.h"

#define CAM_SL(obj) ((CamSL *) obj)
#define CAM_SL_SESSION(obj) ((CamSLSession *) obj)

typedef struct _CamSL CamSL;
typedef struct _CamSLSession CamSLSession;

typedef enum
{
  CAM_SL_SESSION_STATE_IDLE,
  CAM_SL_SESSION_STATE_OPENING,
  CAM_SL_SESSION_STATE_ACTIVE,
  CAM_SL_SESSION_STATE_CLOSING
} CamSLSessionState;

typedef enum
{
  CAM_SL_RESOURCE_STATUS_OPEN = 0x00,
  CAM_SL_RESOURCE_STATUS_NOT_FOUND = 0xF0,
  CAM_SL_RESOURCE_STATUS_UNAVAILABLE = 0xF1,
  CAM_SL_RESOURCE_STATUS_INVALID_VERSION = 0xF2,
  CAM_SL_RESOURCE_STATUS_BUSY = 0xF3
} CamSLResourceStatus;

struct _CamSL
{
  CamTL *tl;

  GHashTable *sessions;
  guint session_ids;

  /* callbacks */
  CamReturn (*open_session_request) (CamSL *sl, CamSLSession *session,
    CamSLResourceStatus *status);
  CamReturn (*session_opened) (CamSL *sl, CamSLSession *session);
  CamReturn (*session_closed) (CamSL *sl, CamSLSession *session);
  CamReturn (*session_data) (CamSL *sl, CamSLSession *session,
    guint8 *data, guint length);

  gpointer user_data;
};

struct _CamSLSession
{
  CamSL *sl;
  CamTLConnection *connection;

  guint resource_id;
  guint16 session_nb;

  CamSLSessionState state;

  gpointer user_data;
};

CamSL *cam_sl_new (CamTL *transport);
void cam_sl_destroy (CamSL *sl);

CamReturn cam_sl_create_session (CamSL *sl, CamTLConnection *connection,
  guint resource_id, CamSLSession **session);
CamReturn cam_sl_session_close (CamSLSession *session);

void cam_sl_calc_buffer_size (CamSL *sl,
  guint body_length, guint *buffer_size, guint *offset);
CamReturn cam_sl_session_write (CamSLSession *session,
  guint8 *buffe, guint buffer_size, guint body_length);

#endif /* CAM_SESSION_H */
