summaryrefslogtreecommitdiffstats
path: root/dom/plugins/ipc/PluginStreamParent.cpp
blob: 1b4cfeb0213cb80a8ac83c8efd55c625d47865a7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/* -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "PluginStreamParent.h"
#include "PluginInstanceParent.h"

namespace mozilla {
namespace plugins {

PluginStreamParent::PluginStreamParent(PluginInstanceParent* npp,
                                       const nsCString& mimeType,
                                       const nsCString& target,
                                       NPError* result)
  : mInstance(npp)
  , mClosed(false)
{
  *result = mInstance->mNPNIface->newstream(mInstance->mNPP,
                                            const_cast<char*>(mimeType.get()),
                                            NullableStringGet(target),
                                            &mStream);
  if (*result == NPERR_NO_ERROR)
    mStream->pdata = static_cast<AStream*>(this);
  else
    mStream = nullptr;
}

void
PluginStreamParent::ActorDestroy(ActorDestroyReason aWhy)
{
  // Implement me! Bug 1005166
}

bool
PluginStreamParent::AnswerNPN_Write(const Buffer& data, int32_t* written)
{
  if (mClosed) {
    *written = -1;
    return true;
  }

  *written = mInstance->mNPNIface->write(mInstance->mNPP, mStream,
                                         data.Length(),
                                         const_cast<char*>(data.get()));
  if (*written < 0)
    mClosed = true;

  return true;
}

bool
PluginStreamParent::Answer__delete__(const NPError& reason,
                                     const bool& artificial)
{
  if (!artificial)
    this->NPN_DestroyStream(reason);
  return true;
}

void
PluginStreamParent::NPN_DestroyStream(NPReason reason)
{
  if (mClosed)
    return;

  mInstance->mNPNIface->destroystream(mInstance->mNPP, mStream, reason);
  mClosed = true;
}

} // namespace plugins
} // namespace mozilla